背包问题
文章平均质量分 51
seez
njfu
展开
-
1205. 买不到的数目(dp)
1205. 买不到的数目 - AcWing题库根据最后一个使用的糖果作为划分依据,可以划分出不重不漏的两个子集使用糖果1 使用糖果2#include <iostream>#include <algorithm>using namespace std;const int N=1e7+10;bool dp[N];int a[N];int main(){ for(int i=1;i<=2;i++) cin>>...原创 2022-02-22 17:31:00 · 103 阅读 · 0 评论 -
1252. 搭配购买(并查集,特殊依赖01背包)
分析:可以看成是特殊的有依赖的背包问题,因为有依赖的背包对于子树是可选可不选,这里是必选全部选,反而变得更加简单了所以我们可以把一堆搭配看成一个集合,然后运用并查集维护并查集的拓展域,做01背包问题并查集拓展域价格域 v ==集合中所有价值和 价值域 w ==集合中所有价格和#include <iostream>#include <algorithm>using namespace std;const int N=10010;int v[N]; ...原创 2022-02-07 18:16:49 · 347 阅读 · 0 评论 -
10. 有依赖的背包问题(树形背包)
10. 有依赖的背包问题 - AcWing题库限制条件:选择子结点必须先选择父节点 选择的物品总体积不能超过m对于所有子树,有两种选择,选或者不选,使用dfs的话,最坏情况是O(2^100),所以我们选择dp,以不同的体积作为集合的划分依据,只留下每个集合的最大值,这样子就可以合理的优化所以我们可以得出,在选择一个结点之前,必须先选择他的父结点,才能对他做01背包状态表示:对以u为根结点的树选择,并且体积不超过j的所有方案状态计算:根据最后一个不同点来进行状态划分选了u...原创 2022-02-02 11:15:52 · 1259 阅读 · 0 评论 -
11. 背包问题求方案数(最优解方案数)
11. 背包问题求方案数 - AcWing题库分析:需要求最优解的方案数,其实也是一个动态规划的过程首先求出背包问题的最优解 动态规划求方案数状态计算:根据最后一个不同点进行划分,也就是对于a[i]的选择情况进行划分选的情况优于不选 cnt[i,j]=cnt[i-1,j-v] 选的情况==不选 cnt[i,j]=cnt[i-1,j]+cnt[i-1,j-v] 选的情况<不选 cnt[i,j]=cnt[i-1,j...原创 2022-02-01 20:51:29 · 641 阅读 · 0 评论 -
7. 混合背包问题
7. 混合背包问题 - AcWing题库对于混合背包问题,其实就是三种背包一起用,但是这里难点在于,多重背包需要二进制优化#include <iostream>#include <algorithm>using namespace std;const int N=1005;int dp[N];int main(){ int n,m; cin>>n>>m; for(int i=0;i<n;i++) ...原创 2022-02-01 20:21:33 · 117 阅读 · 0 评论 -
532. 货币系统(bool型完全背包,贪心)
原题链接分析:对于两个等价的货币系统来说,有以下限制条件对于任意一个非负整数x,要么都可以表示,要么都不可以表示于是可以得出引理,对于两个等价的集合A,B(B表示被简化的系统)A集合中不能被A中其他元素凑出来的数,一定会出现在B集合中 A集合中能被A中其他元素凑出来的数,一定不会出现在B集合中引理1证明:A集合与B集合等价的条件是凑出的数相同,不能凑出的数也相同反证:假如B集合中存在一个不在A集合中且不能被A集合表示出来的数,那么这个数就不能被A集合表示出来,凑不出来,由...原创 2022-02-01 19:59:25 · 414 阅读 · 0 评论 -
487. 金明的预算方案(分组背包)
限制条件:一个主件有多个附件,可以选择不买和买几个 必须先购买主件再购买附件所以对于一个主件最多有四种选择这里使用位运算枚举所有选择,也可以用爆搜枚举for(int y=0;y<1<<servent[i].size();y++) { int vv=master[i].first,ww=master[i].first*master[i].second; for(int z=...原创 2022-02-01 16:41:20 · 349 阅读 · 0 评论 -
1013. 机器分配(分组背包原理,输出方案)
原题链接e分析:分组背包问题是互斥选择模型,即一个物品组内只能做出一种决策选择,叫做分组背包问题分组背包问题,如果运用分组背包模型来做的话,如下转换每个公司看成一个物品组,我们至多可以选择m个,选择0~m个操作是互斥的,只能做一个,因此对于分给第 i个 公司 的不同 机器数量 可以分别看作是一个 物品组 内的 物品状态计算初始化:全部初始化为0状态计算:根据最后一个不同点/最后一次选择来进行划分,可以划分为以下子集当前选择0个...原创 2022-02-01 15:52:04 · 757 阅读 · 0 评论 -
12.背包问题求具体方案
原题链接要求背包的一个具体方案,就是求他每一步的决策,然后输出所有决策为1(取)的选择要输出字典序最小的方案由于要输出字典序最小的方案,所以最终方案能选择1,就尽量选择,能选择2,就尽量选择...所以枚举应该是从后往前递推,如果字典序越小的物品能够选择就尽可能的选择for(int i=n;i>=1;i--) //从后往前递推 for(int j=1;j<=m;j++) { dp[i][j]=dp[i+1][...原创 2022-02-01 15:12:07 · 1727 阅读 · 0 评论 -
1020.潜水员 (二维费用背包,“至少至多恰好”)
题意:要求完成工作需要的气缸重量最低值原问题:要求考虑k个气缸,完成氧含量至少为n,氮含量至少为m的气缸重量的最低值子问题:要求考虑前i个气缸,完成氧含量至少为x,氮含量至少为y的气缸重量的最低值由于氧含量,氮含量可能超出目标所需要的,所以这里是至少为x,y初始化:dp[0][0]=0,其他的均为INF注意:即使所需要的氧气或者氮气所需的是数量是负数,状态表示的含义是至少为负数...,所以就包含了[0~m][0~n]的所有集合,所以应该用[0][0]来表示所以在状态转移的时候..原创 2022-02-01 14:05:39 · 125 阅读 · 0 评论 -
背包问题中的“至少至多恰好”问题
前言对于背包问题的至少,至多,恰好问题,他们的状态转移方程其实是不变的,需要考虑的只有初始化的问题和一些特殊点的特判这里的二维指的是没有状态优化的二维,而不是二维费用\求方案数初始化二维情况1、体积至多j,f[0][i] = 1, 0 <= i <= m,其余是02、体积恰好j,f[0][0] = 1, 其余是03、体积至少j,f[0][0] = 1,其余是0 状态转移max(0,..)从状态定义的本身出发一维情况1、体积至...转载 2022-02-01 14:03:30 · 373 阅读 · 0 评论 -
6.多重背包问题3 (单调队列优化)
原题链接原创 2022-02-01 11:34:38 · 604 阅读 · 0 评论 -
牛客寒假训练营 1 A 九小时九个人九扇门(01背包,打表找规律)
步骤打表找性质,优化 数学模型 dp优化遇事不决打个表,先打表模拟样例找规律右边为数字根,可以发现规律,9进制,逢9进一那么数字根==(数)%9特殊点,当余数==0 时 ,数字根为 9验证验证出,对于前面所有的数字和,第i个数的数字根+数字和的根 == (第i个数+数字和)的数字根数学模型题目要求枚举出所有种组合每个组合都当且仅有两个选择 选 或者 不选直接枚举肯定会超时,想到dp也可以达到枚举的效果,只是记录下了重复的步骤,所以采用dp算法...原创 2022-01-25 14:43:02 · 458 阅读 · 0 评论 -
9. 分组背包问题
#include <iostream>#include <algorithm>using namespace std;const int N=105;int v[N][N],w[N][N];int s[N];int dp[N][N];int main(){ int n,m; cin>>n>>m; for(int i=1;i<=n;i++) { cin>>s[i];...原创 2022-01-23 16:16:53 · 152 阅读 · 0 评论 -
4.多重背包问题 (时间优化,空间优化)
首先是多重背包问题的朴素版,简单模板for(int i=1;i<=n;i++) for(int j=0;j<=m;j++) { dp[i][j]=dp[i-1][j]; for(int k=0;k*v[i]<=j&&k<=num[i];k++) dp[i][j]=max(dp[i][j],dp[i-1][j-k*v[i]]+k*w[i]);...原创 2022-01-23 15:42:02 · 195 阅读 · 0 评论 -
3. 完全背包问题
与01背包问题不同点在于01背包问题,每个物品只能取一次完全背包问题,每个物品可以取无限次状态表示:dp[i][j] 考虑前i个物品,选择的体积不超过j的最大价值集合:所有考虑前i个物品,选择的体积不超过j的所有集合边界:都为0集合划分/状态计算:通过对最后一个不同点进行划分,可以分为不重不漏的多个子集没有选第i个物品,dp[i][j]=max(..,dp[i-1][j]) 选了第i个物品 dp[i][j]=max(...,dp[i-1][j-v[i]]+w[i...原创 2022-01-23 14:44:14 · 211 阅读 · 0 评论 -
四种方法解决01背包问题
01背包问题01背包问题可以用dp或者dfs的方法来做dfs的好处在于:它可以找出所有的选择方案,如果题目需要找方案的个数或者输出所有方案,就只能够选择dfs,而如果是用来输出最值,那么还是dp好点dp的好处在于:dp是用来找出最优的方案,dp在每个1~V的体积总能找出当前体积下的最优方案(贪心),那么到最后他显然是输出的最优的方案,而如果要找出方案的个数,dp就显得无能为力了1.记忆化搜索本题的dfs搜索树如下#include <iostream>#i.原创 2021-11-10 18:51:12 · 8818 阅读 · 1 评论