题目描述
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
输入描述:
每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
输出描述:
对输入的每组数据M和N,用一行输出相应的K。
示例1
输入
7 3
输出
8
解析:动态规划问题,
用递归方法解决
即把M分为N个数的和,可以有0,利用递归,当M等于1或者N等于1时只能有一种结果,当M小于0时,返回0;
其他情况:每次有一个是空盘子,即0,把M个苹果分为N-1份,依次递推;
再给每个盘子依次放一个苹果,将M-N个苹果放入N个盘子中;
上述两种情况并不冲突,所以可以相加。
#include<iostream> using namespace std; int fun(int M,int N) { if(M==1||N==1) return 1; else if(M<0||N==0) return 0; else return fun(M,N-1)+fun(M-N,N); } int main() { int M,N; while(cin>>M>>N) { cout<<fun(M,N)<<endl; } return 0; }
动态规划解决:
int main() { int M,N; int a[100][100]; while(cin>>M>>N) { for(int i=0;i<=M;i++) { a[i][1] = 1; a[i][0] = 0; } for(int i =0;i<=N;i++) { a[0][i]=1; } for(int i=1;i<=M;i++) { for(int j=1;j<=N ;j++) { if(i<j) a[i][j]=a[i][i]; else a[i][j]=a[i][j-1]+a[i-j][j]; } } cout<<a[M][N]<<endl; } return 0; }