HDU 1171 Big Event in HDU【01背包】

题意:给出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]);		
	}
}

  

posted @ 2015-02-12 08:03  sequenceaa  阅读(124)  评论(0编辑  收藏  举报