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 }