HDU 1171 Big Event in HDU
意思是将物品尽量分成价值相近的两部分,那么就总价值除以2,然后就是多重背包的做法
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> using namespace std; int v[55], r[55], m; bool dp[130000]; void deal(int x) { int i; if(v[x]*r[x]>=m) { for(i=v[x];i<=m;i++) if(dp[i-v[x]]) dp[i]=true; } else { int k=1; while(k<r[x]) { for(i=m;i>=k*v[x];i--) if(dp[i-k*v[x]]) dp[i]=true; r[x]-=k; k*=2; } for(i=m;i>=r[x]*v[x];i--) if(dp[i-r[x]*v[x]]) dp[i]=true; } } int main() { int n, i, all; while(scanf("%d",&n)!=EOF) { if(n<0) break; all=0; for(i=0;i<n;i++) scanf("%d%d",&v[i],&r[i]), all+=v[i]*r[i]; m=all/2; for(i=1;i<=m;i++) dp[i]=false; dp[0]=true; for(i=0;i<n;i++) deal(i); for(i=m;i>=0;i--) if(dp[i]) break; printf("%d %d\n",all-i,i); } return 0; }