hdu 2110 资产分割 母函数

来源:互联网 发布:阿里云iot事业部 编辑:程序博客网 时间:2024/05/23 01:23

题目: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 10010int 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;}