
背包DP
文章平均质量分 70
背包
Happig丶
我的孤独,虽败犹荣
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Codeforces 1741G. Kirill and Company(BFS/位运算/分组背包)
上述问题可以用分组背包解决,分组背包实际上解决的问题就是若干组物品,每组最多选出一个,使得不超过背包容量时价值之和最大。个人按位来表示,对于每个有车的人,求出有多少种二进制集合表示的方案,他可以带每种方案的人回家。没车,当枚举到状态(左边为最低位)“1110” 代表如果带前三个人搭车回家,能否将三个人都送回家,如下图所示。个人没有车,其他人都有车,没车的人可以搭顺风车回家,通过搭车安排使得。对于每个有车的人,求出有多少种二进制集合表示的方案后,问题变成了,个人中无法搭车走回家的人最少,求出这个最少的人数。原创 2022-10-25 14:53:53 · 783 阅读 · 1 评论 -
洛谷 P1249 最大乘积(贪心/01背包)
传送门题目大意给出一个正整数 nnn ,将 nnn 分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。解题思路方法一按背包的思路来考虑,有1−n1-n1−n这些数,每个数选或不选,背包的容量是nnn。最终价值是相乘求得,可以使用对数运算将乘法变为加法,且最终要求的是背包容量恰好为 nnn 的情况,并打印解。#include <bits/stdc++.h>using namespace std;#define ENDL "\n"typedef long long l原创 2021-07-05 09:15:53 · 319 阅读 · 0 评论 -
背包九讲(6)——分组背包
问题引入有 N 组物品和一个容量是 V 的背包每组物品有若干个,同一组内的物品最多只能选一个每件物品的体积是 vij,价值是 wij,其中 i 是组号,j 是组内编号求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大,输出最大价值状态转移实际上多重背包是分组背包一种衍化版本,或者说多重背包是特殊情况下的分组背包在多重背包那里,我们的主要想法是将s个物品分成s种物品,每种分别是1,2,…,s个物品,然后相当于这s种物品为一组,我们选择最优的一组for(int i=1;i&l原创 2020-05-09 11:33:24 · 689 阅读 · 0 评论 -
背包九讲(5)——二维费用的背包
问题引入有 N 件物品和一个容量是 V 的背包,背包能承受的最大重量是 M每件物品只能用一次。体积是 vi,重量是 mi,价值是 wi求解将哪些物品装入背包,可使物品总体积不超过背包容量,总重量不超过背包可承受的最大重量,且价值总和最大,输出最大价值状态转移令f(i,j)表示当前背包容量为i,背包的重量为j时的最大价值显然有f(i,j) = max{ f(i,j) , f(i-vi,j-wj) }实际上增加了一个等价的条件——背包承重不能超过M,因此类似于容量不超过V,我们逆序枚举M-0,原创 2020-05-09 11:01:42 · 306 阅读 · 0 评论 -
背包九讲(4)——混合背包
问题引入有 N 种物品和一个容量是 V 的背包物品一共有三类:第一类物品只能用1次(01背包)第二类物品可以用无限次(完全背包)第三类物品最多只能用 si 次(多重背包)每种体积是 vi,价值是 wi求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大,输出最大价值状态转移显然这里就需要两种不同的转移状态,一种是01背包和多重背包,另外一种是完全背包前面也解释了,多重背包实际上相当于将si个物品拆分为1-si个新物品,那么我们使用二进制拆分优化的多重背包分为两原创 2020-05-09 10:52:45 · 160 阅读 · 0 评论 -
背包九讲(3)——多重背包
问题引入有 N 种物品和一个容量是 V 的背包。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大,输出最大价值朴素算法有了01背包和完全背包的基础,其实多重背包在上面二者的结合考虑下很容易得出在01背包的基础上再添加一个循环,枚举所有满足k*v<=j且k<=s的所有k,即为更新每种容量的答...原创 2020-05-08 13:57:55 · 299 阅读 · 0 评论 -
背包九讲(2)——完全背包
问题引入有n种物品每种无限个,第i个物品的体积为vi,价值为wi,选一些物品装入到容量为C的背包中,使得背包内物品在不超过容量C的情况下价值和尽量大从DAG模型到完全背包DAG模型,相信看过紫书第九章的都不陌生,我是从紫书开始的动态规划之旅,就先说下这个吧硬币问题问题描述:有n种硬币,面值分别为V1,V2,…,Vn,每种无限多。给定一非负整数S,可以选用多少个硬币使得面值之和恰好为S...原创 2020-05-07 01:20:28 · 304 阅读 · 0 评论 -
背包九讲(1)——01背包
问题引入有n种物品,每种只有一个。第i种物品的体积为vi,价值为wi。选一些物品装入到一个容量为m的背包中,使得在总体积不超过m的情况下使得背包内物体总价值尽量大状态转移首先我们不难发现影响决策的因素有两个:第i个物品装或者不装使用j(j<=m)容量后得到的最大价值实际上容量是一个有序的枚举过程,但是每个物品选或不选是影响决策的主要因素,下面有两种对称的状态定义:逆序枚...原创 2020-05-06 21:30:45 · 418 阅读 · 0 评论 -
牛妹的春游(二维费用背包+技巧)
题目链接题目大意众所周知,牛妹要组织公司的出游。要准备面包和饮料。她买到的面包和饮料都是捆绑销售的,也就是说,一个大包装里面x个面包+y个饮料,花费t元。为了满足公司的要求,需要一定数量的面包和饮料。你的任务就是帮助牛妹计算,为了满足公司需要,一共最少花费多少钱。输入样例5 60 53 36 12010 25 1295 50 2501 45 1304 20 119输出样例249分析之前简单看过二维费用的01背包,有点印象,但是这个题并不按照常理出牌,只给出需要的容量,却没有最大的原创 2020-07-10 12:25:56 · 249 阅读 · 0 评论 -
2019 CSP-J 纪念品(完全背包+思维)
题目描述小伟突然获得一种超能力,他知道未来TTT天NNN种纪念品每天的价格。某个纪念品的价格是指购买一个该纪念品所需的金币数量,以及卖出一个该纪念品换回的金币数量。每天,小伟可以进行以下两种交易 无限次:任选一个纪念品,若手上有足够金币,以当日价格购买该纪念品;卖出持有的任意一个纪念品,以当日价格换回金币。每天卖出纪念品换回的金币可以立即用于购买纪念品,当日购买的纪念品也可以当日卖出换回金币。当然,一直持有纪念品也是可以的。TTT 天之后,小伟的超能力消失。因此他一定会在第TTT天卖出所原创 2020-07-11 09:32:10 · 1875 阅读 · 0 评论 -
背包衍化——二维01背包
问题引入有两种物品捆绑销售,每种包装里两种物品各有x,yx,yx,y个,售价为ttt元,共有sss个捆绑销售的包装。现在需要两种物品n,mn,mn,m个,问如何购买可以满足需要并且花费最少的钱状态转移设d[i][j]d[i][j]d[i][j]表示第一、二种物品分别买了i,ji,ji,j个的最小花费,那么状态转移方程为:d[i][j]=min(d[i][j],d[i−x][j−y]+t)d[i][j]=min(d[i][j],d[i-x][j-y]+t)d[i][j]=min(d[i][j],d[i原创 2020-09-20 09:43:55 · 126 阅读 · 0 评论 -
牛客算法周练——Music Problem(dp / bitset + 鸽巢定理)
题目链接1.题目大意:给出一个序列,从中选择若干数(至少一个)能否得到3600的倍数2.可能一开始想到,怎么枚举,有那么多种情况,但是实际上也就3600种情况,设dp[i]为余数为i的选择,每次判断a[i]时,我们拿它和之前的1-3599种已经存在的答案相加取模保存,下面就更新每种新得到的答案,最后更新一下dp[a[i]],这里提前对每个a[i]取模处理。为什么不能提前对dp[a[i]]处...原创 2020-04-16 13:15:50 · 351 阅读 · 0 评论 -
2017四川省赛K - 2017 Revenge(原根+DP+bitset)[待补]
传送门题目大意给出n≤2e6n\leq 2e^6n≤2e6个数且范围是[1,2016][1,2016][1,2016],从中选出若干个数相乘使得二者的乘积对2017取模为rrr,求方案数的奇偶性解题思路之前见过相加问最后取模能否得到的一道题:传送门但是这道题是相乘的,根据DPDPDP的思路,不难得出设d[0/1][j]d[0/1][j]d[0/1][j]为考虑第iii个数且取模后结果为j(0≤j≤2016j(0 \leq j \leq 2016j(0≤j≤2016得到的方案数,那么代码如下:d原创 2020-10-14 17:11:56 · 326 阅读 · 0 评论