1019 Problem S
题意:给定一组设备的价值V,及其数量M,如果能够将这组设备分为两组,并使其价值A、B,并且A>=B。
思路:对于所有设备的价值,求得总价值的1/2后,然后将题目转化为0-1背包。
感想:题目一上来,将设备分组,很可能无从下手,而通过其平均价值,转化为0-1背包后,只要弄清价值、数量,几个循环之间的关系,以及状态方程即可。
#include<iostream>
using namespace std;
int f[111111],v[51],m[101];
int main(){
int i,j,k,N,sum,w;
while(cin>>N){
if(N<0) break;
for(i=0;i<N;i++)
cin>>v[i]>>m[i];
sum=0;
for(i=0;i<N;i++)
sum+=v[i]*m[i];
w=sum/2;
for(i=0;i<=w;i++)
f[i]=0;
for(i=0;i<N;i++)
for(k=0;k<m[i];k++)
for(j=w;j>=v[i];j--)
f[j]=max(f[j],f[j-v[i]]+v[i]);
cout<<sum-f[w]<<" "<<f[w]<<endl;
}
return 0;
}