【AcWing算法基础班】动态规划(一)学习笔记

一、背包问题的类型

(1)01背包(0:不用;1:用)
给N个物品,容量是V的背包。用v表示单个物品的体积,w表示单个物品的权值。每件物品最多只能用一次。目标:能放入背包,选出物品的总权值最大。
(2)完全背包(完全:物品个数无限,可以装多次)
(3)多重背包(每个物品个数有限)
(4)分组背包
物品有N组,每一组物品里面有若干个。每一组里面最多只能选一个物品。

二、01背包问题

样例:N=4,V=5
(v,w):(1,2),(2,4),(3,4),(4,5)
答案:8
什么是DP:
①状态表示:f[i][j]
字母f是集合,此集合中包含所有选法,限制条件是:只从前i个物品中选,总体积小于等于j
表示的是属性,即最大值、最小值、数量等,背包问题要求最大值。
答案:f[N][V]
②状态计算
本质:集合划分,即包含第i个物品和不包含第i个物品的两个子集
Ⅰ不含i的子集:从1~i-1中选,总体积不超过j,即f[i-1][j]
Ⅱ含i的子集:从1~i中选,且都包含第i个物品,总体积不超过j
操作:先把所有选法里的第i个物品都去掉,但这不影响最大值的那种选法
变成:从1~i-1中选,加上第i物品后,总体积不超过j,即原来的选法是,去掉第i个物品后,总体积不超过j-v[i],表示为f[i-1][j-v[i]],为去掉第i个物品后的最大值,此时再加上w[i],即为所求
01背包状态计算公式:f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i])
条件:j>=v[i];若j<v[i],则f[i][j]=f[i-1][j]
③01背包的优化解法
本质:去掉一维,变成f[j]
i从1~n,若从v[i]到M枚举j,则
思考:f[j]=max(f[j],f[j-v[i]]+w[i])等价于什么?
样例:N=4,V=5
(v,w):(1,2),(2,4),(3,4),(4,5)
i=1,f[1]=w[1],f[2]=f[1]+w[1],f[3]=f[2]+w[1],f[4]=f[3]+w[1]
结果:i=1,f[1]=2,f[2]=4,f[3]=6,f[4]=8,第一个物品选了多次
实际:i=1,f[1]=2,f[2]=2,f[3]=2,f[4]=2,第一个物品只选一次
f[i][j]=max(f[i][j],f[i][j-v[i]]+w[i])
处理方法:j的循环顺序从M到v[i],即从大到小,就没有继承关系了
优化结果:空间复杂度降一维
④滚动数组
如果f[i]只用到了f[i-1],可以开一个二维数组f[2][N]
可以由f[0]推得f[1],再由f[1]推得f[0],循环往复

三、完全背包问题

集合划分:按照第i个物品选多少个分为若干组,即第i个物品选0个、选1个、选2个、……、选k个。
曲线救国:1.去掉k个物品i
2.完全背包状态计算公式:f[i][j]=max(f[i][j],f[i-1][j-kv[i]]+kw[i])
这里的max里的f[i][j]代表不断更新f[i][j],没有特殊含义
而01背包中的f[i-1][j]代表k取0时的状态
限制条件:kv[i]<=j
理解:f[i][j]=max{f[i-1][j-k
v[i]]+kw[i],k=0,1,2,3,……}
K取0和1时,即为01背包。
3.完全背包问题的优化
∵f[i][j]=max{f[i-1][j],f[i-1][j-v[i]]+w[i],f[i-1][j-2
v[i]]+2w[i],……}
f[i][j-v[i]]=max{f[i-1][j-v[i]],f[i-1][j-2
v[i]]+w[i],f[i-1][j-3v[i]]+2w[i],……}
∴f[i][j]=max{f[i-1][j],f[i][j-v[i]]+w[i]}
限制条件:k*v[i]<=j,否则f[i][j]=f[i-1][j]
优化结果:时间复杂度降一维
若写成f[j]=max{f[j],f[j-v[i]]+w[i]}
样例:N=4,V=5
(v,w):(1,2),(2,4),(3,4),(4,5)
i=1,f[1]=2,f[2]=4,f[3]=6,f[4]=8
理解:要的就是当前层的状态,j从v[i]到M即可
优化结果:空间复杂度降一维

四、多重背包问题

状态表示f[i][j]:所有只从前i个物品中选,并且总体积不超过j的选法
属性:max
状态计算:按照第i个物品选多少个来划分集合,从选0个、1个、2个,……,一直到选s[i]个,s[i]为可以选择的第i个物品个数的上限
朴素版本:f[i][j]=max(f[i-1][j-kv[i]]+kw[i]),k=0,1,2,……,s[i]
完全背包都到f[i-1][j-kv[i]]结束,但是多重背包问题不同:
∵f[i][j]=max{f[i-1][j],f[i-1][j-v[i]]+w[i],f[i-1][j-2
v[i]]+2w[i],……,f[i-1][j-s[i]v[i]]+s[i]w[i]}
f[i][j-v[i]]=max{f[i-1][j-v[i]],f[i-1][j-2
v[i]]+w[i],……,f[i-1][j-s[i]v[i]]+(s[i]-1)w[i],f[i-1][j-(s[i]+1)v[i]]+s[i]w[i]}
∴即已知C=max{A,B},C已知,B已知,如果C=B,则A不能求出
不能直接用完全背包的方式优化多重背包问题
优化方式:二进制优化
思考:假设s[i]=1023,真的需要从0枚举到1023吗?
可以把若干个第i个物品打包在一起,一块考虑
打包成10组,即1,2,4,8,……,512
从这10组中选物品,每个物品最多只能选一次
必定能从这10组中拼凑出0到1023的任意一个数,证明:
前1组,能凑0-1
前2组,能凑0-3
前3组,由于前2组能凑0-3,加上4之后,能凑4-7,共能凑0-7
前4组,由于前3组能凑0-7,加上8之后,能凑8-15,共能凑0-15
以此类推,前10组能凑0-1023
这是一种倍增的思想,即前k组能凑0-2^k-1
例:s[i]=200,怎么打包?
解:1,2,4,8,16,32,64,此时能凑0-127,于是再补73,即可。
证明:给出一个s[i],分组为1,2,4,8,……, 2 k 2^{k} 2k,C,满足 2 k + 1 2^{k+1} 2k+1>s[i], 2 k 2^{k} 2k<s[i],且C=s[i]-2^k+1
先不看C,能凑0~2^(k+1)-1
再考虑C,加上C能凑C-( 2 k + 1 2^{k+1} 2k+1-1+C),即C~s[i]
由于s[i]< 2 k + 1 2^{k+1} 2k+1,故C< 2 k + 1 2^{k+1} 2k+1- 2 k 2^{k} 2k+1= 2 k + 1 2^{k+1} 2k+1<2^(k+1)-1
得一共能凑0~s[i]。
思路:将s[i]拆成logs[i]
由于这logs个物品每个物品最多选一次,就变成了01背包
变形为:有N
logs个物品,每个物品最多选一次
先进行N
logs次拆分,再用01背包循环N
V
logs次计算
时间复杂度:N
V
logs

五、分组背包问题

状态表示:f[i][j]
集合:只从前i组物品中选,且总体积不大于j的所有选法
属性:max
状态计算:枚举第i组物品选哪个或不选
集合划分:第i组物品都不选、从第i组物品中选第k个物品
第i组物品都不选:f[i][j]=f[i-1][j]
从第i组物品中选第k个物品:f[i][j]=f[i-1][j-v[i][k]]+w[i][k]
得优化版本f[j]=max(f[j],f[j-v[i][k]]+w[i][k])
按01背包解法,且k从0枚举到s[i],限制条件j>=v[i][k]

六、总结

①01背包问题
理论推导公式:f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i])
优化计算公式:f[j]=max(f[j],f[j-v[i]]+w[i]),j从M到v[i]
②完全背包问题
理论推导公式:f[i][j]=max(f[i][j],f[i-1][j-kv[i]]+kw[i])
优化计算公式:f[j]=max(f[j],f[j-v[i]]+w[i]),j从v[i]到M
③多重背包问题
分组1,2,4,8,……, 2 k 2^{k} 2k,C,满足 2 k + 1 2^{k+1} 2k+1>s[i], 2 k 2^{k} 2k<s[i],且C=s[i]-2^k+1
先进行Nlogs次拆分,再用01背包循环NV次计算
④分组背包问题
理论推导公式:f[i][j]=max(f[i-1][j],f[i-1][j-v[i][k]]+w[i][k])
优化计算公式:f[j]=max(f[j],f[j-v[i][k]]+w[i][k]),j从M到v[i][k]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

keguaiguai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值