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.大方向把握本题,属于递归问题,还有一种解法:用递推关系式解,这样要从大方向上分析问题,归纳总结。
相关文章推荐
- POJ 1664 放苹果(递归或DP)
- POJ 1664 求m个苹果放入n个盘子的不同放法数目 递归 分类讨论
- poj 1664 放苹果 递归
- POJ-1664 放苹果(递归的运用)
- poj 1664 放苹果,递归(深度优先搜索)
- poj 1664 放苹果(递归)
- POJ 1664 求m个苹果放入n个盘子的不同放法数目 递归 分类讨论
- POJ 1664 /NYOJ 758 放苹果问题(递归)
- poj--1664--放苹果(递归好体)
- POJ-----1664---放苹果---递归 思维
- POJ:1664 放苹果(递归,思维)
- poj--1664--放苹果(递归好体)
- poj1664递归放苹果
- 递归及递推问题系列之 放苹果 poj 1664
- poj 1664 m个苹果放入n个盘子,递归写法和DP写法
- POJ 1664 放苹果 (递归)
- POJ 题目1664 放苹果(递归)
- POJ 1664 分苹果(递归)。
- POJ 1664放苹果(递归问题)
- poj 1664 放苹果 递归