**
解题思路:
**
首先用dp[j][i]来表示有j个苹果放在i个盘子里。
j<i:意思就是盘子多了,例如2个苹果放在7个盘子里,和2个苹果放在2个盘子里方法数是一样的(本题是这样滴。。。)。所以:dp[j][i]=dp[j][j];
j==i:例如3个苹果放3个盘子里,等于3个苹果放3个盘子的方法数(就是1),加上3个苹果放2个盘子的方法数。所以:dp[j][i]=1+dp[j][i-1];
j>i:例如题干的7个苹果放3个盘子里,先算把盘子都放满的方法数(只包括7个苹果放3个盘子(每个盘子都至少先放一个苹果),放好后就剩下4个苹果,方法数就等于4个苹果放入3个盘子的总方法数(可以有盘子为空)),然后加上上一次的方法数[就是加上7个苹果放2个盘子的总方法数(可以有盘子为空,即包括7个苹果放2个盘子和7个苹果放1个盘子)]。所以:dp[j][i]=dp[j][i-1]+dp[j-i][i];
print最开始的for嵌套是先给赋初值,比如把上面的7个苹果放1个盘子的方法数
赋值为1。。。。。
#include<stdio.h>
int dp[15][15],t,m,n;
void print(){
for(int j=0;j<=m;j++){
for(int i=0;i<=n;i++){
if(j==0||j==1)
dp[j][i]=1;
if(i==1||i==0)
dp[j][i]=1;
}
}
for(int j=2;j<=m;j++){
for(int i=2;i<=n;i++){
if(i>j)
dp[j][i]=dp[j][j];
if(i<j)
dp[j][i]=dp[j][i-1]+dp[j-i][i];
if(i==j)
dp[j][i]=1+dp[j][i-1];
}
}
printf("%d\n",dp[m][n]);
}
int main(){
scanf("%d",&t);
for(int i=0;i<t;i++){
scanf("%d %d",&m,&n);
print();
}
return 0;
}
有帮助就点个赞啵,来手赞赏也是非常妙的