【递归】 放鸡蛋

Sicily1006. 递归:放鸡蛋

Description

把M个同样的鸡蛋放在N个同样的篮子里,允许有的篮子空着不放,问共有多少种不同的放法?(用K表示)5,1,1和1,5,1是同一种分法。

输入:鸡蛋M,篮子N

输出:鸡蛋的放法(降序,不重复)

Sample
input:

1

7
3

Sample
output:

700

610

520

511

430

421

331

322

解题思路:

(参考sicily1004
整数划分:m表示鸡蛋,
n表示篮子数(最深输出栈),depth表示当前放鸡蛋的篮子位置(递归的深度),num数组储存依次放鸡蛋结果.初始化:cin
>> m >> n; num为空;
depth = 0.~\(≧▽≦)/~啦啦啦,反正这里栈就是篮子,篮子就是栈)

  1. m
    == 0 时,表示没有鸡蛋可以放,此时输出存储结果,跳回上一个栈。

·若此时栈的深度等于篮子数,则正常输出;

·若此时栈的深度大于篮子数,不合题意不输出;

·若此时站的深度小于篮子数,多余的篮子放0个鸡蛋。

  1. m
    > 0 时,首先,第一个篮子可以放i个鸡蛋(其中降序要求i从m到1)

·当处在第0层栈时可直接放i个鸡蛋,num[depth]
= i;

·若当前药房的i个鸡蛋小于等于上一层栈的数,则

这一层栈存放i个鸡蛋num[depth]
= i;

·若当前i大于上一栈(篮子)则跳过不存(因为要满足降序,

且避免重复)

然后,剩下的m-i个鸡蛋继续向下调用栈继续存放直到鸡蛋放完。

图解:

num:


i(1)


……depth=0……

n-i(1)鸡蛋(i(1)--)→……


i(1)


i(2)


……depth=1……

n-i(1)-i(2)i(2)--)→……


i(1)


i(2)


i(3)


……depth=3……

0个鸡蛋i(3)--)→……


i(1)


i(2)


……depth=m……

符合格式就输出否则跳过,返回上一栈i(m)--

参考代码:

#include<iostream>
usingnamespacestd;
voiddisplay(int*num,intn,intdepth){
inti;
if(depth<=n){
for(i=0;i<depth;i++)
cout<<num[i];
for(;i<n;i++)
cout<<0;
cout<<endl;
}
}
voidfun(intm,intdepth,intn,int*num){
if(m==0){
display(num,n,depth);
}else{
for(inti=m;i>=1;i--){
if(depth==0||i<=num[depth-1]){
num[depth]=i;
fun(m-i,depth+1,n,num);
}
}
}
}
intmain(){
intt,M,N,num[50]={0};
cin>>t;
for(;t>0;t--){
cin>>M>>N;
fun(M,0,N,num);
}
}
时间: 2024-10-14 22:02:14

【递归】 放鸡蛋的相关文章

放鸡蛋_鸡蛋篮子问题1

Description 把M个同样的鸡蛋放在N个同样的篮子里,允许有的篮子空着不放,问共有多少种不同的放法?(用K表示)5,1,1和1,5,1是同一种分法. Input 第一行是测试数据的数目t(0 <= t <= 20).以下每行均包含二个整数M和N,以空格分开.1<=M,N<=10. Output 对输入的每组数据M和N,用一行输出相应的K. Sample Input 1 7 3 Sample Output 8 这道题有一系列的问题,这一题求的是有多少种放法,还有一题是打印每一

北京大学 程序设计与算法(二)递归 放苹果

例题:放苹果 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分发?5,1,1和1,5,1是同一种分发. 输入 第一行是测试数据的数目t(0<=t<=20).以下每行均包含二个整数M和N,以空格分开.1<=M,N<=10. 输出 对输入的每组数据M和N,用一行输出相应的K 样例输入 1 7 3 样例输出 8 思路: 设i个苹果放在k个盘子里放法总数是f(I,k),则: k>i时,f(i,k)=f(i,i) k<=i时,总放法=有盘子为空的放

(eden)eggs

题目名称 eggs 题目描述 Erin买了不少鸡蛋,她发现一天吃不完这么多,于是决定把n个同样的鸡蛋放在m个同样的篮子里,允许有的篮子空着不放,请问共有多少种不同的放法呢? 注意:2,1,1和1,2,1 是同一种分法. Input 第一行是测试数据的数目t(0 <= t <= 20).以下每行均包含二个整数m和n,以空格分开.1<=m,n<=10. Output 对输入的每组数据m和n,用一行输出相应的结果. 例如: Input: 4 3 8 4 7 2 4 4 2 Output:

对java内存模型的认识

浅谈java内存模型        不同的平台,内存模型是不一样的,但是jvm的内存模型规范是统一的.其实java的多线程并发问题最终都会反映在java的内存模型上,所谓线程安全无非是要控制多个线程对某个资源的有序访问或修改.总结java的内存模型,要解决两个主要的问题:可见性和有序性.我们都知道计算机有高速缓存的存在,处理器并不是每次处理数据都是取内存的.JVM定义了自己的内存模型,屏蔽了底层平台内存管理细节,对于java开发人员,要清楚在jvm内存模型的基础上,如果解决多线程的可见性和有序性

java线程安全总结

java线程安全总结 标签: java多线程jvm工作threadobject 2012-02-10 16:22 30158人阅读 评论(8) 收藏 举报 原文: http://www.iteye.com/topic/806990 http://www.iteye.com/topic/808550 最近想将java基础的一些东西都整理整理,写下来,这是对知识的总结,也是一种乐趣.已经拟好了提纲,大概分为这几个主题: java线程安全,java垃圾收集,java并发包详细介绍,java profi

【转】专家:制造业将大批死亡 都怪马云

吴晓波在2014年至2015年的演讲中表示,中国制造业正在在发生着一场非常有趣的变化,一次重大的创新.但是很可能在很长时间里面,中国的这些制造业的转型是走入了一个误区,被马云同志带到沟里面去了. 来源:A股那些事 以下为演讲内容摘录: 大家好, 相关公司股票走势 贝因美10.91+0.989.87% 王府井22.20+1.869.14% 我记得我读大学的时候,读过一本书,其中有一句话我记得很深,马克在战壕里对另外一个人讲,我们这一代人是否比上一代人更值得信任.一代人重要的使命就是把上一代人干掉,

阻塞队列BlockingQueue

BlockingQueue最终会有四种状况,抛出异常.返回特殊值.阻塞.超时,下表总结了这些方法: 抛出异常 特殊值 阻塞 超时 插入 add(e) offer(e) put(e) offer(e, time, unit) 移除 remove() poll() take() poll(time, unit) 检查 element() peek() 不可用 不可用 BlockingQueue是个接口,有如下实现类: 1. ArrayBlockQueue:一个由数组支持的有界阻塞队列.此队列按 FI

CODE[VS] 1294 全排列

1294 全排列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 给出一个n, 请输出n的所有全排列 输入描述 Input Description 读入仅一个整数n   (1<=n<=10) 输出描述 Output Description 一共n!行,每行n个用空格隔开的数,表示n的一个全排列.并且按全排列的字典序输出. 样例输入 Sample Input 3 样例输出 Sample Output 1 2

多线程并发

转于http://m.blog.csdn.net/blog/haolongabc/7249098 浅谈java内存模型        不同的平台,内存模型是不一样的,但是jvm的内存模型规范是统一的.其实java的多线程并发问题最终都会反映在java的内存模型上,所谓线程安全无非是要控制多个线程对某个资源的有序访问或修改.总结java的内存模型,要解决两个主要的问题:可见性和有序性.我们都知道计算机有高速缓存的存在,处理器并不是每次处理数据都是取内存的.JVM定义了自己的内存模型,屏蔽了底层平台