给出每个物体的价值和物体的数量,如何分使得A,B的价值最接近并且A的价值不能小于B的价值
将总的价值/2,作为背包,进行多重背包即可;
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
const int maxx=250010;
const int maxn=55;
int total;
int number[maxn],cost[maxn];
int dp[maxx];
void zero(int w,int v) //01背包
{
for (int j=total;j>=w;j--)
dp[j]=max(dp[j],dp[j-w]+v);
}
void com(int w,int v)//完全背包
{
for (int j=w;j<=total;j++)
dp[j]=max(dp[j],dp[j-w]+v);
}
void multi(int w,int v,int num) //多重背包
{
if (num*v>=total)
com(w,v);
else
{
int k=1;
while (k<num)
{
zero(k*w,k*v);
num-=k;
k=2*k;
}
zero(num*w,num*v);
}
}
int main()
{
int sum,n;
while (scanf("%d",&n)!=EOF)
{
if (n<0)
break;
memset(dp,0,sizeof(dp));
total=sum=0;
for (int i=1;i<=n;i++)
{
scanf("%d%d",&cost[i],&number[i]);
sum+=cost[i]*number[i];
}
total=sum/2;
for (int i=1;i<=n;i++)
multi(cost[i],cost[i],number[i]);
printf("%d %d\n",sum-dp[total],dp[total]);
}
return 0;
}