DP之一

//sicily 1564. HOUSING

/*

对一个数分解成几个因子之和,因子数目不限,但必须不小于5,求有多少种组合方式
比如 m(17) = 7 (namely 17, 5 + 12, 6 + 11, 7 + 10, 8 + 9, 5 + 5 + 7, 5 + 6 + 6)
为避免重复(5 + 5 + 6, 5 + 6 + 5 and 6 + 5 + 5 are counted only once.),规定因子的序列是上升的
于是可以用 dp[i][j] 来表示对 i 分解且第一个因子为 j 的组合数。状态转移方程:
dp[i][j]+=dp[i-j][k]; 这里 5<=j<=i/2 ,j<=k<=i-j
dp[i][j]的第一个因子是 j ,余数为 i-j ,余下的序列 dp[i-j][k]的第一个数 k 应该不小于 j 且不大于 i-j

*/

#include
<iostream> //DP
using namespace std;
int dp[200][200];
int main()
{
for(int i=5;i<=100;++i)
{
dp[i][i]
=1; //只有一个因子
for(int j=5;j<=i/2;++j)
for(int k=j;k<=i-j;++k)
dp[i][j]
+=dp[i-j][k];
}
int n,s=0;
cin
>>n;
for(int i=5;i<=n;++i)
s
+=dp[n][i];
cout
<<s<<endl;
return 0;
}

  

posted on 2011-08-22 12:10  sysu_mjc  阅读(150)  评论(0编辑  收藏  举报

导航