【题目描述】
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
【输入】
第一行是测试数据的数目t(0<=t<=20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
【输出】
对输入的每组数据M和N,用一行输出相应的K。
【输入样例】
1
7 3
【输出样例】
8
第一种:递推算法
#include<bits/stdc++.h>//Writed by Wangzhimin Date:2022.05.10 int apple[105][105];//存放苹果与盘子的数组 int tmp[105];//暂时存的每种放法 using namespace std; int main() { int i,j,k,m,n; scanf("%d",&k);//输入组数 for(int t=0;t<k;t++){//苹果与盘子数 scanf("%d%d",&m,&n); memset(apple,0,sizeof(apple)); for(i=1;i<100;i++)//不一定是100,可是20就可 { apple[i][1]=1;//一个苹果是一种放法 apple[1][i]=1;//一个盘子是一种放法 apple[0][i]=1;//没苹果是一种放法 } for(i=2;i<=m;i++)//从2个苹果和2 个盘子 开始 for(j=2;j<=n;j++){ if(i<j)//如果苹果小于盘子,就是苹果数就行(因为有空盘子) apple[i][j]=apple[i][i]; else//递推公式中的算法,用在递推中 apple[i][j]=apple[i][j-1]+apple[i-j][j];}//有盘子为空,和无盘子为空的放法的和 tmp[t]=apple[m][n];}//求出的值,放在 tmp中 for(i=0;i<k;i++)//输出 cout<<tmp[i]<<endl; return 0; }
第二种:递归算法
#include<bits/stdc++.h> using namespace std; int a[100]; int apple(int m,int n) { if(n>m)return apple(m,m);//有空盘子(一个盘子放一个还有空的) if(m==0)return 1;//没苹果时 if(n==0)return 0;//没盘子时 return (apple(m,n-1)+apple(m-n,n));//有一个空盘加上没有空盘时 } int main() { int n,i,j,m; scanf("%d",&n); for(i=0;i<n;++i) { scanf("%d %d",&m,&j); a[i]=apple(m,j); } for(int i=0;i<n;++i) cout<<a[i]<<endl; return 0; }