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;
}