杭電 1171 Big Event in HDU(606比賽選拔 2017-08-20)(1003)

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






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章