1. 程式人生 > >0-1揹包問題(動態規劃)

0-1揹包問題(動態規劃)

http://acm.hdu.edu.cn/showproblem.php?pid=1171
這道題咋看有點複雜,其實也只是換了一種思維,因為題目要求要儘量平均分配,所以我們可以先將總價值sum求出,然後得出其分配的平均值為sum/2,要注意這個答案可能為小數,但是又因為sum是整數,所以最後得出的sum/2是要小於等於實際的值。將這個結果進行01,揹包,可以得出其中一個宿舍所得的最大價值,而另一個宿舍的最大價值也可以相應的得到,而前者必定小於等於後者。

#include<iostream>
#include<cstring>
#include<algorithm>
#define INF 1000005
using namespace std;

int d[1005][1005];
int v[5005];

    int main(){
    int n;
    
    while(cin >> n,n>0) {
        int sum = 0;
        for(int i = 1,k = 0;k < n;k++)
        {
            int e,f;
            cin >> e >> f;
            sum += e*f;
            while(f--)
                v[i++] = e;
        }
        for(int i = 1;i <= n;i++)
        {
            for(int j = 0;j <= sum/2;j++){
                d[i][j] = (i == 1?0:d[i-1][j]);
                if(j >= v[i])
                    d[i][j] = max(d[i][j],d[i-1][j-v[i]]+v[i]);
            }
        }
        cout << sum - d[n][sum/2] << " " << d[n][sum/2] << endl;
        memset(d,0,sizeof(d));
    }
    return 0;
}