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