摘要: 题目链接:背包问题求方案数 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 阅读(94) 评论(0) 推荐(0) 编辑
摘要: 原题链接 有依赖的背包问题 题目描述 有依赖的背包问题是指物品之间存在依赖关系,这种依赖关系可以用一棵树来表示,要是我们想要选择子节点就必须连同父节点一块选。 我们可以吧有依赖的背包问题看成是分组背包问题中的一个组,子节点的每一种选择我们都看作是组内的一种物品,因此我们可以通过分组背包的思想去写。 阅读全文
posted @ 2020-11-29 00:01 hnkjdx_react 阅读(143) 评论(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 阅读(102) 评论(0) 推荐(0) 编辑
摘要: 题目链接acwing8 这道题目跟01背包问题很像,只不过是在01背包的基础加上了一个重量限制。 01背包问题的动态转移方程是 那么这个多了个重量,那么可以再开一维,变成三维 同01背包,它可以压缩亿下空间,于是变成了 状态转移方程出来了,那么写代码也轻松了. #include <bits/stdc 阅读全文
posted @ 2020-11-28 23:38 hnkjdx_react 阅读(127) 评论(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 阅读(79) 评论(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 阅读(67) 评论(0) 推荐(1) 编辑
摘要: 原题链接AcWing5 基本思考框架 思路和多重背包问题I一样,但这题的数据范围变成1000了,非优化写法时间复杂度O(n^3) 接近 1e9必超时。 优化多重背包的优化 首先,我们不能用完全背包的优化思路来优化这个问题,因为每组的物品的个数都不一样,是不能像之前一样推导不优化递推关系的。(详情看下 阅读全文
posted @ 2020-11-18 22:07 hnkjdx_react 阅读(94) 评论(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 阅读(64) 评论(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 阅读(98) 评论(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 阅读(74) 评论(0) 推荐(0) 编辑