跳出循环-M个苹果N个盘子

virtual judge

1.函数跳出循环可用return

origin:uva101 vector的使用

如果是两(多)层for循环在里层(或中间某一层)中断跳出所有层的循环,这样的操作可以提出来,放到函数中,用return 实现中断跳出

2. M个苹果N个盘子

origin : poj 1664
题目:把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

对于递归要确定的只有递归的终止条件递归方程
终止条件:递归到什么样可以直接给出答案,就是终止条件
递归方程:找关系(规律),怎么才能不断向终止条件靠近。比如终止条件是n=1,那么就考虑f(n)f(n-k)之间有什么关联(k的值根据题目确定,一般是1,或2,总之让n减小,反之如果n从1开始到100时终止,那么就找f(n)f(n+k)之间的关系)

对于这道题,
当m和n等于多少的时候可以直接给出结果呢?考虑,
m=1,n=1【1种】
m=1,n=2/3/4/5…【1种】,可见m<n的情况可能等价于m>=n的情况
m=2/3/45…,n=1【1种】
m=2,n=2【2种】好像也能直接想出来,那么再增大m试一下呢?
m=3,n=2,这种情况你会怎么考虑呢?

  • 放法1: 先每个盘子里放一个,然后最后一个随机放在一个盘子里
  • 放法2:空一个盘子,剩下的盘子和苹果随机放

这就得出了这道题的普遍思路,m=1或者n=1是终止条件,我们的目标就是不断减小m或n的值直到它们中有=1的;递归关系就如m=3,n=2的情况分析那样,

  • 对于放法1:先每个盘子里放一个,那就可以减少m变成m-n,f(m,n)=f(m-n,n)
  • 对于放法2:空一个盘子那就可以减少n变成n-1,f(m,n)=f(m,n-1)

这里还有一个要注意的地方,如果m=n,那么对于放法1,m-n=0,那么对于m=n的情况,我们可知,如果先每个盘子放一个,那么刚好苹果分完,放法1只有这一种放苹果的情况。

 int fun(int m,int n)
 {
 	if(m==1||n==1) return 1;
 	if(m==n) return 1+fun(m,n-1);
 	if(m<n) return fun(m,m);
 	return fun(m-n,n)+fun(m,n-1);
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值