标签:
题目链接:
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