无论是递归还是动态规划关键都在于:
1.递推关系式
2.已知信息(动态规划就是初值,递归就是返回条件)
#include<stdio.h>
#include<string.h>
// 方法1 递归
// int put_apple(int m,int n){
// if(m==0 || n==1) // n=1对应n会减少的出口条件;m==0对应m会减少的条件
// return 1; // 例子:f(2,2) = f(2,1)+f(0,2),f(2,2) = 2,f(2,1)=1,所以f(0,2)=1;
// if(n>m)
// return put_apple(m,m);
// else
// return put_apple(m,n-1)+put_apple(m-n,n);
// }
int main(){
int m,n;
// 方法1 递归
// while(scanf("%d %d",&m,&n)!=EOF) // 防止多组输入 建议使用while
// {
// int num = put_apple(m,n);
// printf("%d",num);
// }
// 方法2 动态规划
while(scanf("%d %d",&m,&n)!=EOF){
int dp[11][10]; // 11 对应苹果数种类 10对应盘子种类
//初始化
for(int i=0;i<11;i++){
if(i<10){
dp[0][i] = 1;
dp[1][i] = 1;
}
dp[i][1] = 1;
}
for(int i = 1;i<=m;i++){
for(int j=2;j<=n;j++){ // j从2开始是因为不会出现0个盘子
if(j>i)
dp[i][j] = dp[i][i];
else
dp[i][j] = dp[i][j-1]+dp[i-j][j];
}
}
printf("%d",dp[m][n]);
}
}



京公网安备 11010502036488号