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;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 13,728评论 0 89
  • (转自http://www.douban.com/group/topic/14820131/,转自人大论坛) 调整...
    f382b3d9bdb3阅读 10,827评论 0 8
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,948评论 18 139
  • 增加法术伤害240,增加移速7%,有小范围爆炸伤害。 爆炸伤害随着法术的增加而增加。 爆炸伤害,不可以吸血。 爆炸...
    乌龟的慢生活阅读 349评论 0 0
  • 鸡年的春节在读书中辞旧迎新。读的是《麦肯锡用人标准》。 作者是日本人,留美MBA毕业后进入日本麦肯锡做了三年的顾问...
    胖小墩鱼阅读 4,527评论 0 5