多重背包问题,可以套模板~
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=51;
int n,sum,v,a[maxn],b[maxn],dp[200001];
void Complete(int cost,int weight)
{
for(int i=cost;i<=v;i++)
dp[i]=max(dp[i],dp[i-cost]+weight);
}
void ZeroOne(int cost,int weight)
{
for(int i=v;i>=cost;i--)
dp[i]=max(dp[i],dp[i-cost]+weight);
}
void Multiply(int cost,int weight,int amount)
{
if(cost*amount>=v)
Complete(cost,weight);
else
{
int k=1;
while(k<amount)
{
ZeroOne(k*cost,k*weight);
amount-=k;
k<<=1;
}
}
ZeroOne(cost*amount,weight*amount);
}
int main()
{
while(scanf("%d",&n)&&n>0)
{
memset(dp,0,sizeof(dp));
sum=0;
for(int i=0;i<n;i++)
{
scanf("%d%d",&a[i],&b[i]);
sum+=b[i]*a[i];
}
v=sum/2;
for(int i=0;i<n;i++)
Multiply(a[i],a[i],b[i]);
printf("%d %d\n",sum-dp[v],dp[v]);
}
return 0;
}