递归 盘子里放苹果问题

需要注意的问题和思路(因为我也是一个菜鸡,所以我的文章都是针对小白的,易懂,方法简单,说的详细一些,讲给大家听,也写给自己看)
第一种情况,盘子的数目大于苹果的数目。
faction(apple,panzi)是总的放置的次数,因为题目允许有的盘子可以不放苹果,那么就相当于,没有放苹果的盘子存在与否,并不会影响次数,则 faction(Apple,panzi)=faction(apple,apple)
第二种情况,盘子的数目小于或者是等于苹果的数目。
这种情况又分为两类 一类是有的盘子里没有苹果,另一类是每个盘子都有苹果
先说第一类,有的盘子没有苹果,这相当于没有苹果的盘子的存在与否不影响放置苹果的放法次数,那么faction(apple,panzi-1),在这里,为什么是减一那,这是说最少的情况会有一个盘子里没有苹果,因为这个题我们是用递归来实现的,那么可能里面还会再用一个盘子没有放苹果的情况。
第二类,每个盘子里都有苹果,那么比如说 3 2 2 这样放,和2 1 1 这样放置,方法的次数是一样的,则faction(apple,panzi)=-=faction(apple-panzi,panzi)
现在分析完了总体思路,还有一个问题,就是返回值应该是什么 比如上面讲的 2 1 1这种分法,如果每个盘子再减去1个,1 0 0 这显然就不符合了,就是说当苹果数目减去盘子数目后为零的时候,就说明这种情况下只有一种分法了,则返回1。还有一点是,有的盘子里没放苹果,盘子的数目减去没放的数目,不会影响结果,但是,当盘子的数目减到1的时候,那么就只有一种放法了,也返回1;
看代码吧
#include
#include
using namespace std;
//放苹果问题
int faction(int apple,int panzi)
{

if(apple==0||panzi==1)
   return 1;

if(panzi>apple)
    return faction(apple,apple);
else
{
    return faction(apple,panzi-1)+faction(apple-panzi,panzi);
}

}
int main()
{
int t,apple,panzi;
cin>>t;
while(t–)
{
cin>>apple>>panzi;
cout<<faction(apple,panzi)<<endl;
}
return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值