简单多重背包
求出能组合出最接近总数一半的方案
#include<bits/stdc++.h>
using namespace std;
int V[120],M[120];
int dp[300020],use[300020];
int main()
{
int N;
while(scanf("%d",&N)==1&&N>0)
{
memset(dp,0,sizeof(dp));
int sum=0;
for(int i=1;i<=N;i++)
{
scanf("%d%d",&V[i],&M[i]);
sum+=V[i]*M[i];
}
dp[0]=1;
for(int i=1;i<=N;i++)
{
memset(use,0,sizeof(use));
for(int j=V[i];j<=sum/2;j++)
{
if(dp[j]==0&&dp[j-V[i]]==1&&use[j-V[i]]<M[i])
{
dp[j]=1;
use[j]=use[j-V[i]]+1;
}
}
}
for(int i=sum/2;i>=0;i--)
{
if(dp[i]==1)
{
printf("%d %d\n",sum-i,i);
break;
}
}
}
return 0;
}