可轉化成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。
#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;
}