题目:http://acm.hdu.edu.cn/showproblem.php?pid=2110
给你n个物品的数量和价值,找到分割出总资产1/3的分割数。
思路:母函数模板,注意结果要%10000,所以每次更新c1的时候就mod10000
#include<iostream>
#include<string.h>
using namespace std;
#define maxn 10010
int c1[maxn], c2[maxn];
int main()
{
int n, p[105], m[105],i,j,all;
while (cin >> n&&n!=0)
{
memset(c1, 0, sizeof(c1));
memset(c2, 0, sizeof(c2));
all = 0;
for (i = 1; i <= n; i++)
{
cin >> p[i] >> m[i];
all += p[i] * m[i];
}
int sum = (p[1] * m[1]);
for (i = 0; i <= m[1]; i++)
c1[i*p[1]] = 1;
for (i = 2; i <= n; i++)
{
for (j = 0; j <= sum; j++)
for (int k = 0; k <= p[i] * m[i]; k += p[i])
c2[j + k] += c1[j];
sum += p[i] * m[i];//找到k的最大值,进行更新
for (j = 0; j <= sum; j++)
{
c1[j] = c2[j]%10000;
c2[j] = 0;
}
}
if (all % 3 == 0 && c1[all / 3] != 0)
{
cout << c1[all / 3] << endl;
}
else
cout << "sorry\n";
}
return 0;
}