标签:
题意:给出n个物品的价值和数目,将这一堆物品分给A,B,问怎样分使得两者的价值最接近,且A的要多于B
第一次做的时候,没有思路---@_@
因为需要A,B两者最后的价值尽可能接近,那么就可以将背包的容量转化为sum/2来做,然后按照01背包的做法来做
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 500005 using namespace std; int dp[maxn],v[maxn],w[maxn]; int main() { int i,j,k,n; while(scanf("%d",&n)!=EOF&&n>0) { int sum=0; memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) { scanf("%d %d",&v[i],&w[i]); sum+=v[i]*w[i]; } for(i=1;i<=n;i++) for(j=1;j<=w[i];j++) for(k=sum/2;k>=v[i];k--) dp[k]=max(dp[k],dp[k-v[i]]+v[i]); printf("%d %d\n",sum-dp[sum/2],dp[sum/2]); } }
HDU 1171 Big Event in HDU【01背包】
标签:
原文地址:http://www.cnblogs.com/wuyuewoniu/p/4287279.html