HDOJ 1171 生成函数

链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1171

题意:

和多重背包一样的意思,划分成两堆,使差最小

题解:

这道题当然可以用完全背包写啊,但也是可以用生成函数的,不过要注意的是输入结束是n<0 而不是 n==-1

代码:

31 int n;
32 int v[50], m[50];
33 int a[MAXN], b[MAXN], last;
34 
35 int main() {
36     while (cin >> n, n >= 0) {
37         rep(i, 0, n) scanf("%d%d", v + i, m + i);
38         a[0] = 1;
39         last = 0;
40         rep(i, 0, n) {
41             int last2 = last + m[i] * v[i];
42             memset(b, 0, sizeof(b));
43             rep(j, 0, m[i] + 1) rep(k, 0, last + 1)
44                 b[k + j*v[i]] += a[k];
45             memcpy(a, b, sizeof(b));
46             last = last2;
47         }
48         per(i, 0, last / 2 + 1) if (a[i]) {
49             printf("%d %d\n", last - i, i);
50             break;
51         }
52     }
53     return 0;
54 }

 

posted @ 2017-05-10 14:43  Flowersea  阅读(178)  评论(0编辑  收藏  举报