题意:
n个种类的物品,每种物品都有价值和数量,让你将这些物品分成两堆使得他们的价值差最小。
题解:
很明显背包就能做,但是还是用母函数做一下,并且它题目很坑就是说不一定是-1结束输入,而是<=0
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=500005;
bool dp[2][N];
int a[N],v[N];
int main()
{
int n;
while(scanf("%d",&n)){
if(n<=0)break;
int f=0;
dp[f][0]=1;
int s=0;
for(int i=1;i<=n;i++)
scanf("%d%d",&v[i],&a[i]),s+=a[i]*v[i];
int top=0;
for(int i=1;i<=n;i++){
int nt=min(top+a[i]*v[i],s/2);
memset(dp[f^1],0,sizeof(bool)*(nt+1));
for(int j=0;j<=top;j++){
if(!dp[f][j])continue;
for(int k=0;k<=a[i]&&k*v[i]+j<=nt;k++)
dp[f^1][k*v[i]+j]=1;
}
f^=1;
top=nt;
}
int ans=0;
for(int i=0;i<=s/2;i++)
if(dp[f][i])
ans=i;
ans=s-ans;
printf("%d %d\n",ans,s-ans);
}
return 0;
}