题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1171
题目大意是:2002年,hdu的计算机学院分成了计算机学院和软件学院,于是就牵涉到设备的分配问题,一共有n中设备,每种设备的单个价值为vi,个数为numi;
问找到一个分配方案,是两个学院的分配的设备的总价值差最小,但必须得保证计算机学院得到的不小于软件学院的;
设所有物品的总价值为m,则此问题就为把所有物品试图填充一个容量为m/2的背包中,使其尽量填满,所以设f[i]为容量为i的背包能装下的最大价值,(注意此处价值和费用是相等的);既f[v]=max(f[v],f[v-a[i].v]+a[i].v);
参考代码如下:
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#define max(a,b) a>b?a:b
using namespace std;
int n,m;
struct tt
{
int v;
int num;
}a[51];
int f[500001];
void execute()
{
int mid=m/2;
int i,j,k;
memset(f,0,sizeof(f));
for(i=0;i<n;i++)
for(k=0;k<a[i].num;k++)
for(j=mid;j>=a[i].v;--j)
f[j]=max(f[j],f[j-a[i].v]+a[i].v);
int as=f[mid];
int bs=m-as;
cout<<bs<<' '<<as<<endl;
}
int main()
{
while(cin>>n&&n>0)
{
m=0;
for(int i=0;i<n;i++)
{
cin>>a[i].v>>a[i].num;
m+=a[i].v*a[i].num;
}
execute();
}
return 0;
}