HDU 1028 [Ignatius and the Princess III] 数字拆分DP
题目链接: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;
}
边完善自己边认识自己

浙公网安备 33010602011771号