输入两个整数
代表苹果数、盘子数。
输出一个整数,代表不同的分法数量。
3 2
2
在这个样例中,有
、
这两种不同的分法。
7 3
8
注意,由于苹果和盘子都是相同的,所以
和
是同一种分法。
#include <stdio.h> //递归 int sd(int m,int n){ if(n==1 || m<=1){//只有一个苹果或只有一个盘子时只有一种情况 return 1; } else if(m>=n){ //苹果多于盘子时等效为 //每个盘子放一个再分配剩余的苹果到盘子(递归到没苹果可放) //+考虑留有空盘再分配其他苹果(递归到只剩一个盘子) return sd(m-n,n)+sd(m,n-1); } else{ return sd(m,m);//盘子数只要多于苹果数就等效于苹果数量的盘子放苹果 } } int main(){ int m,n; scanf("%d %d",&m,&n); //printf("%d",sd(m,n)); //动态规划 int dp[m+1][n+1];//建立表示m,n大小的状态矩阵 for(int i=0;i<=n;i++){//初始化 dp[0][i]=1; dp[1][i]=1; } for(int i=0;i<=m;i++){//初始化 dp[i][0]=0; dp[i][1]=1; } int min; if(m>=n){ min=n; } else{ min=m; } for(int i=2;i<=min;i++){ for(int j=2;j<=i;j++){ dp[i][j]=dp[i][j-1]+dp[i-j][j]; } for(int j=i+1;j<=min;j++){ dp[i][j]=dp[i][i]; } } if(m>=n){//补全状态矩阵 for(int i=n+1;i<=m;i++){ for(int j=2;j<=n;j++){ dp[i][j]=dp[i][j-1]+dp[i-j][j]; } } } else{ for(int i=2;i<=m;i++){ for(int j=m+1;j<=n;j++){ dp[i][j]=dp[i][m]; } } } printf("%d",dp[m][n]); }
#include <stdio.h> #define N 11 int main() { int f[N][N],m,n,i,j; scanf("%d%d",&m,&n); for(i=0;i<N;i++) //i为苹果个数 { for(j=1;j<N;j++) //j为盘子个数 { if(i==0||i==1) f[i][j]=1; else { if(j==1) f[i][j]=1; else { if(i<j) f[i][j]=f[i][i]; else f[i][j]=f[i][j-1]+f[i-j][j]; } } } } printf("%d\n",f[m][n]); return 0; }
#include <stdio.h> int arrange(int m, int n) { if(m == 0 || n == 1) return 1; if(n>m) return arrange(m, m); else return arrange(m, n-1)+arrange(m-n,n); } int main() { int mn[2] = {0,0}; int tmp = 0,cnt = 0; while(scanf("%d",&tmp) != EOF) { mn[cnt++] = tmp; if(cnt == 2) { cnt = 0; int p = arrange(mn[0], mn[1]); printf("%d\n",p); } } return 0; }
#include <stdio.h> #include <stdlib.h> int func(int m,int n) { if(n<0||m<0) { return 0; } else if(m==1||n==1) { return 1; } else { return func(m,n-1)+func(m-n,n); } } int main() { int m,n; while(scanf("%d %d",&m,&n)!=EOF) { printf("%d\n",func(m,n)); } return 0; }