题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2110
题目大意:
公司有N种价值的资产,每种价值的资产数量已知,问能否得到总资产1/3的分割资产方法。
问:分割资产的方案数是多少(mod 10000)。
思路:
给定N种价值的资产,设每种价值Pi的数量为Mi,则总资产为sum = Σ Pi*Mi (1 <= i <= N)。
可得母函数g(x) = Π(1 + x^Pi + x^(2*Pi) + … + x^(Pi*Mi) ) (1 <= i <= N)。找到sum/3的
系数即可。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int c1[10010],c2[10010];
int p[110],m[110];
int main()
{
int N;
while(cin >> N && N)
{
int sum = 0,num = 0;
for(int i = 0; i < N; ++i)
{
cin >> p[i] >> m[i];
sum += p[i]*m[i];
}
if(sum % 3 == 0)
{
int s = sum/3;
for(int i = 0; i <= sum; ++i)
c1[i] = c2[i] = 0;
for(int i = 0; i <=p[0]*m[0]; i += p[0])
c1[i] = c2[i] = 1;
num = p[0]*m[0];
for(int i = 1; i < N; ++i)
{
for(int j = 0; j <= num; ++j)
{
int k = 1;
if(k*p[i] + j > s)
break;
for( ; k <= m[i]; ++k)
{
if(k*p[i] + j > s)
break;
c1[k*p[i]+j] += c2[j];
c1[k*p[i]+j] %= 10000;
}
}
num += p[i]*m[i];
for(int j = 0; j <= num; ++j)
{
c2[j] = c1[j];
}
}
if(c1[s] == 0)
cout << "sorry" << endl;
else
cout << c1[s] << endl;
}
else
cout << "sorry" << endl;
}
return 0;
}
原文:http://blog.csdn.net/lianai911/article/details/45740081