sicily 1564. HOUSING

/*

题意: 对一个数(5<=n<=100)分解成几个因子之和,因子数目不限,但必须不小于5,求有多少种组合方案
比如 m(17)=7 ,即 17=17, 5+12, 6+11, 7+10, 8+9, 5+5+7, 5+6+6, 而 5+5+6, 5+6+5, 6+5+5 看作是一样的
为避免重复,我们可以规定因子的序列是不下降的,
用 dp[i][j] 来表示对 i 分解且第一个因子为 j 的全部组合方案。分情况:
(1) i 分解成只有一个因子,即 j=i,当然方案数是 1
(2) i 分解成一个因子以上, 其中 5 <= j <= i/2 ,那么余下的序列可以表示成 dp[i-j][k],继续分情况:
1. i-j 分解成一个因子, 即 k = i-j , 则方案数是 1
2. i-j 分解成一个因子以上,则 j <= k <= (i-j)/2 ,方案数是 dp[i-j][k]

*/


#include<iostream> //DP
#include <cstring>

using namespace std;
int dp[102][102];
int main()
{
memset(dp,0,sizeof(dp));
for(int i=5;i<=100;++i)
{
dp[i][i]=1; // i 分解成一个因子
for(int j=5;j<=i/2;++j)

{
dp[i][j]+=1; // i-j 分解成一个因子
for(int k=j;k<=(i-j)/2;++k)

dp[i][j]+=dp[i-j][k]; // i-j 分解成一个因子以上
}

}
int n,ans=0;
cin>>n;
for(int i=5;i<=n;++i)
ans+=dp[n][i];
cout<<ans<<endl;
return 0;
}

posted on 2011-07-04 14:04  sysu_mjc  阅读(226)  评论(0编辑  收藏  举报

导航