摘要: 问题描述: 解法: 这个问题变成了每组物品有若干种策略:是选择本组的某一件,还是一件都不选。 这样就可以对每一组转化为 01背包问题 int dp[110],v[110],w[110]; int main() { int n,m; cin >> n >> m; for (int i = 0;i < 阅读全文
posted @ 2020-02-01 22:59 _Ackerman 阅读(235) 评论(0) 推荐(0) 编辑
摘要: 问题描述: 解法: 其实只需要在 01背包 的基础上再增加一个纬度代表重量就可以了 因为是在 01背包 的基础上,所以更新的话我们和 01背包一样从大往小更新 int dp[1010][1010]; int main() { int n,m,v; std::cin >> n >> v >> m; f 阅读全文
posted @ 2020-02-01 22:55 _Ackerman 阅读(196) 评论(0) 推荐(0) 编辑
摘要: 题目链接:https://www.acwing.com/problem/content/7/ 思路: 如果将前面三个背包混合起来,也就是说,有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包),应该怎么求解呢? 01背包与完全背包的混合考虑到 阅读全文
posted @ 2020-02-01 22:43 _Ackerman 阅读(258) 评论(0) 推荐(0) 编辑
摘要: 题目大意: 这个问题和 01背包 问题很相似,我们也可以依然采取 01背包 的状态定义 dp[i][j] 代表前 i 个物品 容量为 j 的背包的最大价值 那么状态转移方程也就出来了: dp[i][j] = max(dp[i][j],dp[i-1][j-k*v[i]]+w[i]) (k 可以为 0, 阅读全文
posted @ 2020-02-01 22:06 _Ackerman 阅读(228) 评论(0) 推荐(0) 编辑
摘要: 问题描述: 基本思路: 这个问题和 01背包 问题非常的相似,只是 01背包 问题要求了每个物品我们最多可以选一次(选和不选两种选择),但是完全背包问题只要容量够我们可以无限制的选 如果我们依然采取和 01背包 一样的状态的定义 dp[i][j] 代表 前 i 个物品 容量为 j 的时候的最大价值 阅读全文
posted @ 2020-02-01 21:32 _Ackerman 阅读(223) 评论(0) 推荐(0) 编辑