HDU 1028 Ignatius and the Princess III

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值