题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1028
题目大意:问N由拆分成1-N这几种数字的和共有几种组合。
关键思想:动态规划。(关键是定义好状态,分类讨论完整)
代码如下:
//DP的关键是分类讨论 #include <iostream> using namespace std; int N; long long dp[130][130];//定义状态(N,M)为数字N由1-M组成的情况数 int main(){ //预处理 for(int i=0;i<125;i++){ dp[i][0]=0,dp[0][i]=1;//初始化,可由特例得出 dp[i][1]=dp[1][i]=1; } for(int i=1;i<125;i++){ for(int j=1;j<125;j++){ if(j>i)dp[i][j]=dp[i][i];//如果M>N,大于N而小于M的数用不到,结果等于dp[N][N]; else{ dp[i][j]=dp[i][j-1];//不用数字M for(int k=1;i-j*k>=0;k++) dp[i][j]+=dp[i-j*k][j-1];//只用1个M,只用2个M,只用3个M…… } } } while(cin>>N){ cout<<dp[N][N]<<endl; } return 0; }