欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HDU 1028 Ignatius and the Princess III

程序员文章站 2024-03-21 18:53:46
...

Ignatius and the Princess III HDU-1028

题目大意:

给定一个数字n,求有多少种用加数相加得到n的方式
如:
n=4
4 = 4 + 0
4 = 3 + 1
4 = 2 + 2
4 = 2 + 1 + 1
4 = 1 + 1 + 1 + 1
需要注意的是 3+1 和 1+3 算同一种 不重复统计

分析:

设出两个未知量num(上式中的4)和m,分别代表“要求的这个数字”和“组成这个数字的最大加数”。
如果num小于m,那么这是不存在的。
DP[num][m]=DP[num][num]

如果num等于m,那么
DP[num][m]=DP[num][m-1]+1

如果num大于m,这是最常规的情况
就像DP[10][4]就等于DP[10][3]+DP[6][4]
DP[num][m]=DP[num][m-1]+DP[num-m][m]

AC代码:

#include <iostream>
#include <cstring>
#define MAX 126
using namespace std;
int DP[MAX][MAX];
int main(){
	memset(DP,0,sizeof(DP));
		//设要求的这个数是num  它的最大加数是m的时候 
	//先初始化
	for(int num=1;num<=125;num++){
		DP[num][1]=1;
		DP[1][num]=1;
	}
	//开始打表
	for(int num=2;num<=125;num++){
		for(int m=2;m<=125;m++){
			if(num<m)   //最大的加数比这个数字本身还大 这不存在
				DP[num][m]=DP[num][num];
			else if(num==m)    //如果最大加数等于这个数字本身时 就用DP[num][上一个数的值]+1 
				DP[num][m]=DP[num][num-1]+1;
			else    //常规情况
				DP[num][m]=DP[num][m-1]+DP[num-m][m];
		}
	} 

	int num;
	while(cin>>num){
		cout<<DP[num][num]<<endl;
	}
	return 0;
}