可转化成01背包问题.
虽然有重复的物品,但可以把每个物品看做是一个独立的个体。这样就相当于把混合背包问题转化成01背包。背包的容量就是{(总价值)/2}.
问题描述
如今,我们都知道,计算机学院是杭州电子科技大学最大的部门。但是,也许你不知道,计算机学院曾经被拆分为计算机学院和软件学院。
分裂绝对是在杭州电子科技大学的一个大事件!同时,它是一个麻烦的事情。所有的设施必须平分。首先,所有设施进行评估,和两个设施被认为是相同的如果他们有相同的价值。假定有n(0<n<1000)各类设施(不同的价值、不同种类)。
输入
输入包含多个测试案例。每个测试案例,从一个数n(0<n<=50——不同设施的总数)。接下来的n行包含一个整数v(0 < v = 50 -设备的值)和一个整数m(0 < < = 100—相应的设施数量)。你可以认为所有V是不同的。
一个测试用例,从一个负整数终止输入和测试案例是不能处理。
输出
对于每一种情况,打印一行包含两个整数a和b表示计算机学院和软件学院的价值分别。A和B应尽可能相等。同时,你要保证不小于B。
Sample Input
2 10 1 20 1 3 10 1 20 2 30 1 -1
Sample Output
20 10 40 40
#include<cstdio>
#include<cstring>
#define mmax(a,b) a>b?a:b
int f[5000];
int dp[255555];
int main()
{
int n;
while(scanf("%d",&n)!=EOF,n>0){
memset(f,0,sizeof(f));
memset(dp,0,sizeof(dp));
int number,value;
int i,j,l=0;
int sum=0;
for(i=0;i<n;i++){
scanf("%d%d",&value,&number);
for(j=0;j<number;j++){
f[l++]=value;
sum+=value;
}
}
for(i=0;i<l;i++){
for(j=sum/2;j>=f[i];j--){
dp[j]=mmax(dp[j],dp[j-f[i]]+f[i]);
}
}
printf("%d %d\n",sum-dp[sum/2],dp[sum/2]);
}
return 0;
}