把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?
注意:如果有7个苹果和3个盘子,(5,1,1)和(1,5,1)被视为是同一种分法。
数据范围:,。
#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; }