题意:一个数 可以分解成多个数相加,有多少种方案。
对于每一个数字n,可以把他分成1,2,3,4....n,组然后最后把所有方案数加在一起,就是n的总共能分的方案数。
对于每一种情况:可以考虑成有n个1,a.在结尾处去掉1。b.数字i减去j个1,剩下的1分成j组有几种方案;
dp[i][j] = dp[i-j][j]+dp[i-1][j-1];
例如:4分成2组,1/111和11/11 两种情况;以此类推 所有的数都可以这样分类。
(看到网上有些大神们一眼就看出了是完全背包,代码简洁,我太笨了。。)
#include<bits/stdc++.h>
using namespace std;
int dp[125][125];
int n;
void init(){
memset(dp,0,sizeof(dp));
for(int i=0;i<=120;i++){
dp[i][1] = 1;
dp[i][i] = 1;
}
for(int i = 1;i<=120;i++){
for(int j=2;j<i;j++){
dp[i][j] = dp[i-j][j]+dp[i-1][j-1];
}
}
for(int i = 1;i<=120;i++){
for(int j = 1;j<=i;j++){
dp[i][j]+=dp[i][j-1];
}
}
}
int main()
{
init();
while(cin>>n)
cout<<dp[n][n]<<endl;
return 0;
}