背包模型题目集合

背包模型

01背包

AcWing 423. 采药

思路:
裸的01背包问题,在本题中我们将采药时间当作背包容量限制,
dp[i][j]表示前i个草药用了j个时间的最大价值
当然可以状态压缩,压缩成一维情况
代码:
代码
状态压缩代码

AcWing 1024. 装箱问题

思路:
01背包问题,在本题中求剩余空间最小,我们可以求最多装多少空间,然后一减就行,最多空间怎么求?我们将空间同时看作01背包里的价值和体积,然后求最大价值即可

代码:

Luogu 2925 干草出售

链接
思路:
和上一个装箱问题一样,体积同时也当价值

代码:

Proud Merchants

链接:
思路:
讲的很详细
01背包加上一个限制条件
每个物品有三个属性:p,q,v
只有当剩余前的数量>=q时才能买
对于两个物品:

  1. p1,q1,v1
  2. p2 q2 v2
    如果先买1后买2,至少需要钱p1+q2
    如果先买1后买1,至少需要p2+q1
    如果买1更划算:p1+q2<p2+q1
    –> q1-p1>q2-p2
    也就是差值大的(限制金额和购买金额)先买
    但是我们排序时,要按照q-p从小到大排序,因为我们的状态表达式dp[i][j]=dp[i-1][j-p[i]]+v[i],式子dp[i-1][j-p[i]]+v[i]说明了我们先买了第i件商品,再考虑第i-1件,这相当于排在后面的商品会先买,所以我们要将差值大的放在后面
    代码:

完全背包

P1616 疯狂的采药

链接
题解:
完全背包裸题
代码:

P1853 投资的最大效益

链接:
题解:
不难看出是完全背包,区别在于要投资n年,而每个债券是年计算的,所以我们每次求出一年的最大价值,然后加在本金上,继续求下一年,也就是s随着年份增加是改变的,每次增加dp[s]
记得数组要开大不然会被卡
代码:

Piggy-Bank

链接:
思路:
题目问最少能存多少钱?这么问的前提是空间都占满了,所以我们将dp的初始值不能赋为0,因为求最少,所以赋值为无穷大,然后正常走一边完全背包即可
代码:

多重背包

Luogu P1776 宝物筛选

多重背包的裸题,记得用二进制优化
代码;

HDU 1059 Dividing

链接:
题解:
要求能否平分价值,那我们就求出总价值,然后看能否用用硬币正好表示出总价值的一半,如果可以就说明能均分。多重背包+dp初始值为-inf
坑点:

  1. 每次数据都要额外输出一行,坑爹
  2. 价值可能为奇数,如果是奇数直接输出不可能,因为c++里面的除是向下取整的,如果不特判会出错
    代码:

混合背包

P1833 樱花

题目:
题解:
混合背包的裸题
代码:

二维费用背包问题

P1507 NASA的食物计划

模板题,就是01背包加一个限制条件
代码:

HDU 2159 FATE

也是模板题,特殊在答案要求输出最大忍耐度,所以在求dp的过程中,对dp>=n的情况记录最低耐力值minn,然后用m-minn即可
代码

分组背包

AreYouBusy

好题,综合性还不错题解+代码

P1757 通天之分组背包

模板题,写错了一个地方卡了我好久。。
代码:

HDU 1712 ACboy needs your help

模板题,稍微变变,n个课,一共m天,我们就分成n组,限制条件为m,每组内的元素分别就是1~m天,注意别出现负下标
代码:

有依赖背包问题

(有待深入了解)

P1064 [NOIP2006 提高组] 金明的预算方案

P1064 [NOIP2006 提高组] 金明的预算方案
Consumer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值