摘要: 分组背包问题是物品有n组,每组里面有若干个物品,每组里最多选一个。 dp[i][j]只从前i组物品中选,且总体积不大于j的最大价值 状态计算:枚举第i组物品选哪个或不选 不选第i组物品,选第i组的第1个物品,选第i组的第2个物品,等等等等 二维做法 1 #include <bits/stdc++.h 阅读全文
posted @ 2020-07-02 17:27 kyk333 阅读(489) 评论(0) 推荐(0)
摘要: 当尝试用和完全背包问题相似的思路试图来优化的时候,就会发现优化不了 用二进制优化 假设我们这件物品一共有1023个 我们真的需要从0到1到2一直枚举到1023吗 有没有一种更高效的方式来枚举呢 可以的 我们把若干个第i件物品打包在一起 打包成2的整次幂的形式 比如说10组 1, 2, 4, 8, . 阅读全文
posted @ 2020-07-02 15:07 kyk333 阅读(177) 评论(0) 推荐(0)
摘要: 多重背包问题是每个物品最多有s[i]个 多重背包问题有朴素版和优化版 dp[i][j]只从前i个物品中选,体积<=j的最大值 根据第i个物品选多少个来划分 三重循环的暴力做法 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int 阅读全文
posted @ 2020-07-02 14:13 kyk333 阅读(227) 评论(0) 推荐(0)
摘要: 完全背包问题是每件物品有无限个 完全背包问题的状态表示和01背包问题一样 dp[i][j]表示只看前i个物品,总体积<= j的最大价值 状态计算: 按照第i个物品选了多少个来分 然后综合起来就是 k是枚举的第i个物品的个数,k = 0, 1, 2,... 三层循环的二维做法 1 #include < 阅读全文
posted @ 2020-07-02 12:11 kyk333 阅读(183) 评论(0) 推荐(0)
摘要: 01背包问题是每件物品要么用0次,要么用1次,最多只用一次 dp[i][j]表示只从前i个物品中选,总体积<=j的选法的最大价值。 二维做法 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 1010; 4 int d 阅读全文
posted @ 2020-07-02 09:34 kyk333 阅读(158) 评论(0) 推荐(0)