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;
} 

  

posted @ 2017-02-17 15:48  哇咔咔咔  阅读(216)  评论(0编辑  收藏  举报