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;
}

你可能感兴趣的:(动态规划)