#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;
}