随笔分类 -  背包问题九讲

摘要:题目链接:背包问题求具体方案 算法一 题目要求输出字典序最小的解,假设存在一个包含第1个物品的最优解,为了确保字典序最小那么我们必然要选第一个。那么问题就转化成从2~N这些物品中找到最优解。之前的f(i,j)记录的都是前i个物品总容量为j的最优解,那么我们现在将f(i,j)定义为从第ii个元素到最后 阅读全文
posted @ 2020-11-29 00:28 hnkjdx_react 阅读(134) 评论(0) 推荐(0) 编辑
摘要:题目链接:背包问题求方案数 01背包 时间复杂度O(nm) 本题求01背包的最佳方案数,那么定义两个数组:f[N],cnt[n] f[i]用来储存背包容积为i时的最佳方案的总价值 cnt[i]为背包容积为i时总价值为最佳的方案数 先初始化所有的cnt[i]为1,因为背包里什么也不装也是一种方案 外层 阅读全文
posted @ 2020-11-29 00:20 hnkjdx_react 阅读(97) 评论(0) 推荐(0) 编辑
摘要:原题链接 有依赖的背包问题 题目描述 有依赖的背包问题是指物品之间存在依赖关系,这种依赖关系可以用一棵树来表示,要是我们想要选择子节点就必须连同父节点一块选。 我们可以吧有依赖的背包问题看成是分组背包问题中的一个组,子节点的每一种选择我们都看作是组内的一种物品,因此我们可以通过分组背包的思想去写。 阅读全文
posted @ 2020-11-29 00:01 hnkjdx_react 阅读(151) 评论(0) 推荐(0) 编辑
摘要:题目链接acwing9 解题思路图解 通过解题思路我们可以写下如下代码 #include<bits/stdc++.h> using namespace std; const int N=110; int f[N][N]; //只从前i组物品中选,当前体积小于等于j的最大值 int v[N][N],w 阅读全文
posted @ 2020-11-28 23:50 hnkjdx_react 阅读(104) 评论(0) 推荐(0) 编辑
摘要:题目链接acwing8 这道题目跟01背包问题很像,只不过是在01背包的基础加上了一个重量限制。 01背包问题的动态转移方程是 那么这个多了个重量,那么可以再开一维,变成三维 同01背包,它可以压缩亿下空间,于是变成了 状态转移方程出来了,那么写代码也轻松了. #include <bits/stdc 阅读全文
posted @ 2020-11-28 23:38 hnkjdx_react 阅读(128) 评论(0) 推荐(0) 编辑
摘要:题目来源acwing7 利用多重背包的二进制优化,可以将一种被扒皮分散为多个01背包,用三个a,b,c数组来记录转换之后的所有背包,c为bool型数组,如果为true,就是完全背包,false则为01背包,最后做一遍,以c的值分类。做完全背包和01背包 #include <iostream> #in 阅读全文
posted @ 2020-11-28 23:18 hnkjdx_react 阅读(81) 评论(0) 推荐(0) 编辑
摘要:题目来源:acwing6 算法1 (单调队列优化) O(NV) 一共是n类物品,背包的容量是m 每类物品的体积为v, 价值为w,个数为s 我们先来回顾一下传统的dp方程 dp[i][j] 表示将前 i 种物品放入容量为 j 的背包中所得到的最大价值 dp[i][j] = max(不放入物品 i,放入 阅读全文
posted @ 2020-11-18 22:16 hnkjdx_react 阅读(71) 评论(0) 推荐(1) 编辑
摘要:原题链接AcWing5 基本思考框架 思路和多重背包问题I一样,但这题的数据范围变成1000了,非优化写法时间复杂度O(n^3) 接近 1e9必超时。 优化多重背包的优化 首先,我们不能用完全背包的优化思路来优化这个问题,因为每组的物品的个数都不一样,是不能像之前一样推导不优化递推关系的。(详情看下 阅读全文
posted @ 2020-11-18 22:07 hnkjdx_react 阅读(97) 评论(0) 推荐(0) 编辑
摘要:题目来源:AcWing4 算法: (把多重背包拆成01背包)很香 C++ 代码 #include <bits/stdc++.h> using namespace std; int a[10005],b[10005]; int main() { int t=0,n,m,dp[10005]={ },w, 阅读全文
posted @ 2020-11-18 21:52 hnkjdx_react 阅读(66) 评论(0) 推荐(0) 编辑
摘要:题目来源:https://www.acwing.com/problem/content/3/ 基本思考框架 C++代码 #include<iostream> using namespace std; const int N = 1010; int f[N][N]; int v[N],w[N]; in 阅读全文
posted @ 2020-11-18 21:13 hnkjdx_react 阅读(100) 评论(0) 推荐(0) 编辑
摘要:题目来源https://www.acwing.com/problem/content/2/ 算法1: 二维数组+动态规划 动态规划知识先导 状态转换方程: 定义f[i][j]:前i个物品,背包容量j下的最优解 (1) 当前背包容量不够(j<w[i]),为前i-1个物品最优解: f[i][j]=f[i 阅读全文
posted @ 2020-11-18 20:56 hnkjdx_react 阅读(76) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示