这道题是让我们将设备根据价值尽可能地平均分成两半,其实就是把设备的价值总和平分成两个部分,然后以此为背包,将这个背包尽可能填满。因为这里的“体积”和“价值”都是设备的价值,所以其实就是求价值的最大值。题目还要求输出时,大的在前面,小的在后面,这可以利用整除的特性做到,因为一个整数a整除2得到的结果一定是小于或等于a/2(非整除)的。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <climits>
#include <algorithm>
using namespace std;
int v[5005];
int dp[1000000];
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n>0)
{
memset(dp,0,sizeof(dp));
memset(v,0,sizeof(v));
int half=0;
int idx=1;
for(int i=1;i<=n;i++)
{
int val,temp;
scanf("%d %d",&val,&temp);
while(temp--)
{
v[idx++]=val;
half+=val;
}
}
int tmp=half;
half/=2;
for(int i=1;i<idx;i++)
for(int j=half;j>=v[i];j--)
dp[j]=max(dp[j],dp[j-v[i]]+v[i]);
int a,b;
a=tmp-dp[half];
b=dp[half];
//cout<<max(a,b)<<" "<<min(a,b)<<endl;
cout<<a<<" "<<b<<endl;
}
return 0;
}