无论是递归还是动态规划关键都在于:
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]); } }