您的位置:首页 > 其它

poj 1664 放苹果(递归)

2014-11-19 17:42 232 查看
/*放苹果
把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
*/
#include<iostream>
using namespace std;
int sum = 0;
//apple表示剩下的要放到盘子里的苹果数量,plate表示当前的盘子数目,j表示
//上一次放到盘子里的苹果数目,本次放的数目比上次放的数目小或相等时,
//才能保证不重复(从大的数目开始循环时)
void putapple_method(int apple,int plate,int j){
if(apple == 0) sum++;
if(plate == 0) return;
for(int i =apple;i>0;i--){//i表示当前放到盘子里的苹果数目
if(i>j) continue;
putapple_method(apple-i,plate-1,i);
}
}
int main(){
int group,m,n;
cin>>group;
while(group--){
cin>>m>>n;
putapple_method(m,n,m);
cout<<sum<<endl;
sum=0;
}
return 0;
}

自己思考,把放苹果的过程用代码实现出来即可,其中,放的时候要注意几个问题:

1.从大到小循环放苹果的步骤时,要保证本次放的苹果数目不大于上一次放的苹果数目,这样就能保证不会出现重复的情况。本问题很容易想到用递归来求解,这样就要记录上次放的苹果数目,可作为参数传到下次递归调用。

2.盘子的数目有限,当盘子用完了苹果还没有放完时,说明此放法不对,当剩下的苹果数目为0时,说明此放法符合要求。

3.putapple_method(int apple,int plate,int j),此函数的作用是:把剩下的apple个苹果放到plate个盘子中 ,(j记录的是上一次放到盘子里的苹果数目),一共有多少种放法,注意给j 赋个较大的初值。写函数时,各个参数代表的实际意义很重要,一定要明确,才能更好的编程,还有,函数的功能是什么,需要哪些必须的参数,也要明确。

4.大方向把握本题,属于递归问题,还有一种解法:用递推关系式解,这样要从大方向上分析问题,归纳总结。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: