需要注意的问题和思路(因为我也是一个菜鸡,所以我的文章都是针对小白的,易懂,方法简单,说的详细一些,讲给大家听,也写给自己看)
第一种情况,盘子的数目大于苹果的数目。
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;
}