0-1背包问题(动态规划)

http://acm.hdu.edu.cn/showproblem.php?pid=1171
这道题咋看有点复杂,其实也只是换了一种思维,因为题目要求要尽量平均分配,所以我们可以先将总价值sum求出,然后得出其分配的平均值为sum/2,要注意这个答案可能为小数,但是又因为sum是整数,所以最后得出的sum/2是要小于等于实际的值。将这个结果进行01,背包,可以得出其中一个宿舍所得的最大价值,而另一个宿舍的最大价值也可以相应的得到,而前者必定小于等于后者。

include

include

include

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;

}

你可能感兴趣的:(0-1背包问题(动态规划))