hdu 1171 母函数
题意:n种物品,第i种价值num[i],数量cnt[i],要将其尽量平分成两份,问这两份的价值各是多少?
分析:多重背包的题,用母函数做的。
输入数据以负数结束,但我看到样例最后一行是-1,就以为是以-1结束,TLE了半天。。。
const int N = 50, M = 250000; int a[2][M+1], p, q, n, sum; int num[N+1], cnt[N+1];//值和个数 int main(){ #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); #endif while(scanf("%d", &n), n>=0){ sum = 0; FOE(i, 1, n) { scanf("%d%d", &num[i], &cnt[i]); sum += num[i] * cnt[i]; } int s = sum>>1, temp=0, t; memset(a, 0, sizeof a); q = 0; a[0][0] = 1; FOE(i, 1, n){ p = 1-q; temp += num[i] * cnt[i]; t = min(temp, s); FOE(j, 0, t) if(a[q][j]) { FOE(k, 0, cnt[i]){ int v = j+k*num[i]; if(v>t) break; a[p][v] += a[q][j]; } } memset(a[q], 0, sizeof a[q]); q = p; } FOD(i, s, 0) if(a[q][i]) { printf("%d %d\n", sum-i, i); break; } } return 0; }