算法:背包问题

1、0-1背包问题

价值V,重量W,任一物品只有一件,总共n件物品,容量为m

// 递推式:dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])
// dp[i][j] 代表可选择前i件物品,重量小于等于j的最大价值
// 由于之和i-1有关,可以降为一维求解,倒序使得小的没更新
for(int i=1; i<=n; i++) {
    for(int j=m; j>=w[i]; j--) {
        dp[j] = Math.max(dp[j], dp[j-w[i]] + v[i]);
    }
}

2、 完全背包问题

任一物品有无限件

// 递推式: dp[i][j] = max(dp[i][j],dp[i][j-w[i] + v[i])
//依然可以降为一维,顺序使得小的都更新了
for(int i=1; i<=n; i++) {
    for(int j=w[i]; j<=m; j++) {
        dp[j] = Math.max(dp[j], dp[j-w[i]] + v[i]);
    }
}

3、多重背包问题

物品i有c[i]件

// dp[j] = max{dp[j], dp[j−k∗a[i]]+k∗b[i]}  1<=k<=c[i]
for(int i=1; i<=n; i++) {
    for(int j=m; j>=w[i]; j--) {
        for(int k=0; k<=c[i] && k*w[i]<j; k++) {
            dp[j] = Math.max(dp[j], dp[j-k*w[i]] + k*v[i]);       
        }
    }
}

4、混合背包问题

以上问题混合时

for(int i=1; i<=n; i++) {
    if(i是0-1背包)
        0-1背包问题方法
    else if(i 是完全背包)
        完全背包问题方法
    else if(i 是多重背包)
        多重背包问题方法
}
全部评论

相关推荐

02-17 20:43
西北大学 Java
醉蟀:别浪费时间。老板是一个想入行互联网的新人。去年6 7月boss上面看到的。他把所有人都拉到一个微信群,然后一个一个面,自己也在学技术。公司就是一个小区里面租的两间房。都没有买电脑啥的。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 听劝,这个简历怎么改 #
14081次浏览 182人参与
# 面试被问“你的缺点是什么?”怎么答 #
6309次浏览 98人参与
# 水滴春招 #
16296次浏览 346人参与
# 入职第四天,心情怎么样 #
11280次浏览 63人参与
# 租房找室友 #
8005次浏览 53人参与
# 读研or工作,哪个性价比更高? #
26151次浏览 356人参与
# 职场新人生存指南 #
199185次浏览 5509人参与
# 参加完秋招的机械人,还参加春招吗? #
26960次浏览 276人参与
# 文科生还参加今年的春招吗 #
4108次浏览 31人参与
# 简历无回复,你会继续海投还是优化再投? #
48619次浏览 561人参与
# 你见过最离谱的招聘要求是什么? #
144708次浏览 829人参与
# 如果重来一次你还会读研吗 #
155714次浏览 1706人参与
# 机械人选offer,最看重什么? #
69076次浏览 449人参与
# 选择和努力,哪个更重要? #
44269次浏览 492人参与
# 如果再来一次,你还会学硬件吗 #
103643次浏览 1245人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
20519次浏览 413人参与
# 招聘要求与实际实习内容不符怎么办 #
46703次浏览 494人参与
# 22届毕业,是读研还是拿外包offer先苟着 #
4652次浏览 27人参与
# 你们的毕业论文什么进度了 #
901211次浏览 8960人参与
# 软开人,你觉得应届生多少薪资才算合理? #
81371次浏览 496人参与
# 国企还是互联网,你怎么选? #
109189次浏览 853人参与
牛客网
牛客企业服务