hdu 1171(Big Event in HDU) (dp)

Problem Link adress:http://acm.hdu.edu.cn/showproblem.php?pid=1171

Problem analysis:

本题可以转换为多重背包问题。DP算法的最大特点就是计算最优解。

题目大意:计算机学院要分成计算机学院和软件学院,即这两个新的学院要“分家”,要求尽可能的公平,即两家学院分的的财产尽可能的接近,如果实在无法保证相等的话,计算机学院分的的财产不能少于软件学院的。

可以以财产的总和的一半为背包,求的背包最大值。

因为每件物品可以有很多件,所以本题为多重背包问题,可以把多重背包转化为01背包来解决。

 

 

#include<iostream>
#include<cstring>
using namespace std;
int dp[200000];
int v[55],n[55];
int max(int a,int b)
{
	return a>b?a:b;
}
int main()
{
	int t;
	int i;
	int sum;
	while(cin>>t)
	{
		if(t<0)
			break;
		sum=0;
		for(i=0;i<t;i++)
		{
		   cin>>v[i]>>n[i];
		   sum+=v[i]*n[i];
		}
		memset(dp,0,sizeof(dp));
		int j,k;
		int all=sum;
		sum/=2;
		for(i=0;i<t;i++)
		{
			for(j=1;j<=n[i];j++)
			{
				for(k=sum;k>=v[i];k--)
				{
					dp[k]=max(dp[k-v[i]]+v[i],dp[k]);
				}
			}
		}
		int rest=all-dp[sum];
		if(rest>dp[sum])
		{
			swap(rest,dp[sum]);
			
		}
		cout<<dp[sum]<<" "<<rest<<endl;
	}
	return 0;
}

  

你可能感兴趣的:(event)