![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
背包问题
wmtmw
之前的博客:https://wmtmw.github.io/
展开
-
分组背包问题
题目来源相当于有N种物品,每种物品有S+1种选法dp[i][j] =max(dp[i-1][j],dp[i-1][j-v1]+w1,…,dp[i-1][j-vs]+ws)=>j从大到小遍历dp[j] =max(dp[j],dp[j-v1]+w1,…,dp[j-vs]+ws)具体代码import java.util.Scanner;public class Main{ ...原创 2020-04-24 10:47:00 · 291 阅读 · 0 评论 -
二维费用的背包问题
题目来源比之前的01背包问题多了一个重量,解法还是一样的。状态转移方程:dp[i][j][k] = max(dp[i-1][j][k],dp[i-1][j-v[i]][k-m[i])+w[i])优化成两维dp[j][k] = max(dp[j][k],dp[j-v[i]][k-m[i])+w[i])优化后,时间复杂度不变O(NVM),空间复杂度O(VM)由于0<N≤100...原创 2020-04-24 09:29:32 · 120 阅读 · 0 评论 -
混合背包问题
题目来源分析1.可以分成三类分别做s = -1:01背包s = 0:完全背包s = 1:多重背包2.可以将三类都转换成多重背包s = -1 => s = 1s = 0 => s = 1000 (因为背包总体积最大为1000,所以无限件最多也就能用1000件)具体代码import java.util.Scanner;public class Main{...原创 2020-04-23 23:51:59 · 104 阅读 · 0 评论 -
多重背包问题II:二进制优化
题目来源分析1.把多重背包问题拆成01背包问题假如物品a有7件,可以拆成物品a1,a2,…,a7各1件但这样拆复杂度依然很高。因此采用二进制拆法:拆成a1{v1,w1},a2{v12,w12},a3{v14,w14}选1件 a1选2件 a2选3件 a1+a2选4件 a3选5件 a1+a3选6件 a2+a3选7件 a1+a2+a3这样等效有7种选法如果s!= 2的...原创 2020-04-23 22:49:52 · 233 阅读 · 0 评论 -
多重背包问题I
题目来源多重背包问题即每种物品可以使用的次数有限,如果为1次就是01背包问题,如果为无限次就是完全背包问题。分析完全背包问题,如下因为可以使用无限次,所以k的约束条件为:kv[i]<=j对于本题,第i种物品使用次数为s[i]因此约束条件改为k <= s[i]&&kv[i]<=jfor(int i = 1;i <= 物品种数;i++){ fo...原创 2020-04-23 21:18:07 · 142 阅读 · 0 评论 -
完全背包问题:最大价值(java)
题目来源完全背包问题是每件物品可以使用无限次,而01背包问题是每件物品最多可以使用一次(用或者不用两种情况)示例分析要求的是放哪些物品,分别放多少件,使总价值最大for(int i = 1;i <=物品总数;i++){//物品总数做最外层循环,那么物品放进背包是有顺序的。//如果一种结果是(物品1,物品2),那只有一种情况,//而不会出现(物品1,物品2)和(物品2,物品...原创 2020-04-23 18:07:29 · 2358 阅读 · 0 评论 -
完全背包问题:凑硬币(java)
力扣每日一题:硬币给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007)示例输入: n = 10 输出:4 解释: 有四种方式可以凑成总金额:10=1010=5+510=5+1+1+1+1+110=1+1+1+1+1+1+1+1+1+1//来源:力扣(LeetCode)思路:1.刚看到...原创 2020-04-23 12:14:22 · 952 阅读 · 0 评论 -
01背包问题
题目来源有 m件物品和一个容量是 n 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。思路:二维动态规划dp[i][j]:前i个物品,体积为j的最大价值若j < v[i], 那么第i个物品无法放入背包,此时有dp[i][j] = dp[i-1][j]若j >...原创 2020-04-23 15:47:36 · 238 阅读 · 0 评论