#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAX 300000
int dp[MAX],v[1000],m[1000];
int main()
{
int i,j,n,k;
while(cin>>n&&n>=0)
{
int sum=0;
for(i=1;i<=n;i++)
{
cin>>v[i]>>m[i];
sum+=v[i]*m[i];
}
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
for(j=1;j<=m[i];j++)
{
for(k=sum/2;k>=v[i]*j;k--)
{
if(dp[k]<dp[k-v[i]]+v[i])
dp[k]=dp[k-v[i]]+v[i];
// cout<<dp[k]<<endl;
}
}
if(sum-dp[sum/2]>dp[sum/2])
cout<<sum-dp[sum/2]<<" "<<dp[sum/2]<<endl;
else cout<<dp[sum/2]<<" "<<sum-dp[sum/2]<<endl;
}
return 0;
}
K题 多重背包
最新推荐文章于 2022-08-10 15:42:02 发布