HDU1171 0-1背包问题

题意和思路:给出物品价值和数量,数组存储每个物品的价值,重复的分别存储,转化为0-1背包问题,要使得a,b分得的价值最接近且a不小于b,总价值的一半就是背包的容量。

代码如下:

#include<iostream>
#include<cstring> 
#include<cmath>
#include<algorithm>
#include<stdio.h>
using namespace std;
int main()
{
	int n,v,c;
	int dp[300000],p[5005];
	while(cin>>n&&n>=0)
	{
		memset(dp,0,sizeof(dp));
		memset(p,0,sizeof(p));
		int k=0,i,j,sum=0;
		for(i=0;i<n;i++)
		{
			cin>>v>>c;
			for(j=0;j<c;j++)
			{
				p[k++]=v;
				sum+=v;
			}
		}
		//for(int i=0;i<k;i++)
			//cout<<p[i]<<endl;
		
		for(i=0;i<k;i++)
		{
			for(j=sum/2;j>=p[i];j--)
			{
				dp[j]=max(dp[j],dp[j-p[i]]+p[i]);
			}
		}
		cout<<sum-dp[sum/2]<<' '<<dp[sum/2]<<endl; 
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41712955/article/details/81288404
今日推荐