
背包
文章平均质量分 55
1
1E6
这个作者很懒,什么都没留下…
展开
-
[洛谷 P1450 HAOI2008] 硬币购物 (容斥应用好题)
[洛谷 P1450 HAOI2008] 硬币购物题目链接大致题意:4 种面值的硬币,第 iii 种的面值是 cic_ici。nnn 次询问,每次询问给出每种硬币的数量 did_idi 和一个价格 sss,问付款方式解题思路:如果用背包做的话时间复杂度是O(4ns)O(4ns)O(4ns),超时!但是这道题明显的特点是硬币一共就四种.抽象模型,其实就是让我们求方程∑i=14cixi=s,xi<=di\sum_{i=1}^4c_ix_i=s,x_i<=d_i∑i=14cix原创 2021-11-16 12:29:22 · 463 阅读 · 0 评论 -
[洛谷 P3177 HAOI2015] 树上染色 (树形分组背包 经典)
[洛谷 P3177 HAOI2015] 树上染色题目链接大致题意:要求将k个点染成黑色,求黑点两两距离及白点两两距离,使他们之和最大解题思路:我们把点与点的距离化简为点到点之间边的计算,怎么把距离转化为边的计算呢,就是记录每一条边被经过的次数,也就是统计每条边的贡献求每一条边的贡献任务量很大,我们再降低难度,求某一条边的贡献边的贡献来源于它在两点的路径上,如果两点在同一侧,那对边没有贡献,只有在边的两侧,才会对边产生贡献,也就是说,边的两侧没有一对合法的点,边就会被经过一次,贡献就会加1原创 2021-11-09 16:47:31 · 200 阅读 · 0 评论 -
[洛谷 P1272] 重建道路 (树形背包 经典)
[洛谷 P1272] 重建道路题目链接大致题意:概述:删除最少数量的边,使得存在一棵节点数恰好是p个的子树解题思路:最常见的就是f[i][j]为以i为根的子树,保留j个节点拆掉的最小边数可以发现题解中各种初始化和转移琳琅满目,有的-1,有的-2.其实就是因为dp状态没有讲清楚先说第一种,f[i][j]表示以i为根的子树,保留j个节点,且当前子树与父节点相连,拆掉的最小边数每个状态代表一棵子树,这个子树与父节点相连初始化: f[i][1] = son[i] 一开始的点都是不连儿子只连原创 2021-11-09 11:05:57 · 424 阅读 · 0 评论 -
[洛谷 P1273] 有线电视网 (树形分组背包)
[洛谷 P1273] 有线电视网题目链接大致题意:n个节点,m个叶子节点,根节点为1号点,每一条边都有一个边权,代表花费,叶子节点具有点权,代表收益问在总收益>=0的情况下,可以连通最多多少个叶子节点如果我简化题意不是很清楚,请看原题意解题思路:这个题不是很好想,如果我们把每棵子树看作是一个分组,那么组内可以不选叶子节点,可以选一个,可以选两个…也就是说,每一个组内最多只有一种决策,分组背包!!分组背包的状态表示是前i个组中,选j个物品的最大收益但是我们这是树形结构,要在加一原创 2021-11-06 10:51:03 · 236 阅读 · 0 评论 -
B. Checkout Assistant (01背包)
B. Checkout Assistant题目链接大致题意:n件物品,每件物品有价格c[i]和收银员扫描时间t[i],当收银员扫描物品时,可以偷物品,偷一件物品只需一秒,但当t[i]=0时,不能偷物品求最少需要花费多少钱,可以购买n件物品(物品顺序可以随意决定)解题思路:01背包的变形扫描一件物品需要t[i]时间,言外之意就是在此期间,我们可以偷走t[i]件物品,也就是对于第i件物品,我们可以得到t[i]+1件物品问题就转化为,n件物品,第i件物品体积是t[i]+1,价值是c[i]答案就原创 2021-09-24 16:16:42 · 476 阅读 · 0 评论 -
E - Knapsack 2 (01背包 大数据)
E - Knapsack 2题目链接大致题意:略~解题思路:01背包背包重量1e9,传统方法必然超时但是N*v最大是1e5,所以我们可以枚举价值状态表示:f[i]表示i价值所需要的最小体积只要f[i]<=m,就更新resAC代码:#include <bits/stdc++.h>#define rep(i, n) for (int i = 1; i <= (n); ++i)#define debug(c) cout << #c <<原创 2021-07-14 15:11:35 · 661 阅读 · 0 评论 -
牛牛去买球 (01背包)
牛牛去买球题目链接大致题意:牛牛去买球,有n个盒子,每个盒子有ai红球,bi篮球,价格是ci,每个盒子会有偏差,即可能的情况有(ai+1,bi-1),(ai, bi), (ai-1, bi+1)三种,求出牛牛至少买k个同色球最少花多少钱解题思路:01背包,背包的容量为球的个数,背包的价值为所取的价值状态表示:f[i]表示买i个球的最少花费分析:至少k个同色球,先分开考虑两个球,考虑每种颜色球都是单色的最坏情况,即考虑红球时,每次都是ai-1,考虑蓝球时,每次都是bi-1,分别做01背包原创 2021-07-04 22:45:24 · 190 阅读 · 0 评论 -
排兵布阵 (分组背包)
排兵布阵题目链接大致题意:s名玩家,n座城堡,每名玩家都是m个士兵,已知该s名玩家会派a[i]士兵争夺i城堡,只有你派出的士兵严格大于其二倍,才会得到i分,求最后的最高得分解题思路:背包问题,具体来说是分组背包,即每组中最多选一个刚开始可能想不到分组背包,我们如果把每座城堡的s名玩家派出士兵个数从小到大排序,我们如果排除士兵的个数大于最后一名玩家的两倍,其他的玩家就不用考虑,肯定满足大于其他玩家的两倍,此时的得分就是k*i (k是排序后第几名玩家),这样看的话,按城堡分组,每组选一个物原创 2021-06-15 17:19:53 · 425 阅读 · 0 评论 -
消失之物 (01背包)
消失之物题目链接大致题意:求少了第i个物品,装满大小为j的背包的方案数(答案mod10 )解题思路:暴力做法就是做n次01背包,每次对应减去第i件物品 时间复杂度O(n^2m)思考:少了第i件物品,即使在求方案数时减少了对第i件物品的转移我们可以先求做一遍01背包,在这个基础上减去对应的转移即可f[i][0]表示不减去任何物品体积是i的方案数f[i][1]表示减去某件物品体积是i的方案数转移方程见代码AC代码:#include <bits/stdc++.h>原创 2021-06-15 15:16:44 · 101 阅读 · 0 评论 -
牛客 xinjun与阴阳师(01背包)
题目链接: xinjun与阴阳师大致题意:初始体力为m,有n种模式,每种模式对应a[i]个操作,分别给出每个操作需要耗费的体力和得到的收益,要求每种模式每日只能选一个操作,问收益最大是多少解题思路:01背包AC代码:#include <bits/stdc++.h>using namespace std;const int N = 1010;int n, m;int f[N];int a[N], w[N][N], v[N][N];int main() { int t原创 2021-02-04 19:37:27 · 153 阅读 · 0 评论 -
找零钱问题(多重背包)
题目链接: 找零钱问题大致题意:给定钱数m,有n种不同面值的钞票,问最少用几张钞票可以凑出m解题思路:多重背包AC代码:#include <bits/stdc++.h>using namespace std;const int N = 1e3 + 10;int a[N];int n, m;int f[N];int main() { while (cin >> m >> n) { for (int i = 1; i <= n; ++原创 2021-01-12 17:25:00 · 318 阅读 · 0 评论 -
2020 China Collegiate Programming Contest Weihai Site L Clock Master(分组背包)
题目链接:L Clock Master大致题意:给出一个数n,令n=a1+a2+a3+a4+…等于n,并使a1a2a3a4…的最小公倍数最大,结果取对数解题思路:思考:什么情况下a1a2a3a4…在满足和一定但最小公倍数最大,那就a1 a2 a3…是不同的素数或者素数的整次幂,也就是素数或者素数本身的整次幂只能选一个,我们发现,满足分组背包的性质,在每组物品中只能选一个,这样我们自然而然的会想到把素数和它的整次幂看成是一组,然后进行分组背包操作首先我们需要进行预处理,就是求素数,我们考虑用欧原创 2020-10-31 09:56:48 · 250 阅读 · 0 评论 -
第八届蓝桥杯省赛C++A/B组 包子凑数(完全背包)
题目链接:包子凑数大致题意:有几个物品,每个物品无限个,每个物品选任意个,能否凑到某个重量。问一共有多少数字是凑不出来的,如果有无限个,输出INF解题思路:如果有无限个凑不出来,说明这些数gcd不是1裴蜀定理 ,任意两个数的组合必定是他们gcd的倍数,同样可以推广到更多数:如果这些数的gcd是d,那么他们的组合是d的倍数,如果d不是1,那么必然有无限个数无法被组合出来当gcd为1时,最大不能表示出来的 数是:(a−1)(b−1)−1,而99和98是100内最大的互质的数,所以这个上界选择1原创 2020-10-27 08:07:01 · 1008 阅读 · 0 评论 -
Codeforces Cut Ribbon(完全背包)
题目链接: [Cut Ribbon]大致题意:给出一条丝带长度n,要求把丝带切成给定长度a,b,c中的一种或多种最多能切成几条(保证至少有一个解)解题思路:目实质上就是问:刚好装满完全背包,可以装的最大数量为多少dp[i]表示装满容量i时的最大数量AC代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;int dp[5000];原创 2020-09-23 19:34:20 · 523 阅读 · 0 评论 -
HDU - 1864 最大报销额(01背包)
题目链接: [最大报销额]大致题意:给一些发票,每张发票都有一个报销额,每张发票还有一个判断合不合法的过程,它要求的是每张发票上的A,B,C每类都不大于,每张发票要么全报要么全不报。问你在总报销额不大于Q的情况下最大的总报销额是多少解题思路:假设每张发票的重量都是1,背包容量就是发票的张数只要从大到小枚举张数就好了,碰见第一个不大于Q的值就是答案AC代码:#include <bits/stdc++.h>typedef long long ll;using namespac原创 2020-09-12 10:58:28 · 166 阅读 · 0 评论 -
HDU - 2602 Bone Collector(01背包)
题目链接: [Bone Collector]大致题意:骨头收集者带着体积V的背包捡骨头,已经每个骨头的重量和价值,求能装进背包的最大价值解题思路:01背包,每个骨头有两种选择,装和不装,具体看代码AC代码:#include<iostream>#include<string>#include<cmath>#include<algorithm>typedef long long ll;using namespace std;struc原创 2020-09-10 21:42:59 · 310 阅读 · 0 评论