16周学习总结

本文详细探讨了动态规划及其在解决背包问题中的应用,包括01背包、完全背包、多重背包和分组背包问题。动态规划的核心思想是通过最优子结构和无后效性解决复杂问题,而背包问题则在此基础上展示了不同的决策策略。作者强调了理解状态转移方程和无后效性的重要性,并指出动态规划的学习需要大量实践和理解。
摘要由CSDN通过智能技术生成

目录

一·动态规划(DP)

二.多个背包问题:

1.01背包问题:

2.完全背包问题:

3.多重背包问题:

4.分组背包问题:

总结:


一·动态规划(DP)

这周对于DP而言,将PPT上面给出的例题看了看,由于准备考试,博客零零散散的读了几篇,周末又临时看了几篇。练习的话就试着写洛谷上的DP练习,但是还是不会分析,因为我现在觉得在DP问题中我确实进行的比较困难,无论进行哪方面时,基本都是比较难理解,特别是关于状态转移方程的方面,DP必须要投入大量的时间才能够理解并熟练掌握。

1.DP的思想就是将一个问题分解成一堆小问题,再通过小问题解出最优解,就可求得大问题的最优解。

2.DP需要注意的问题:

(1)最优子结构及无后效性:原问题的最优解包含了其子问题、更小规模问题的最优解;无后效性指的是某阶段的状态一旦确定,则此后不再受此前各个状态的影响
(2)重叠子问题:子问题有可能被多次利用,因此对这些子问题只求解一次,将结果存储起来即可

3.在做题时遇到的问题:

在做题的过程中,往往会涉及后效性的问题,比如我使一个阶段达到最优解时,再去考虑下一个阶段时,发现要达到下一个阶段最优解会影响到上一个阶段的最优解,这时候就要以无后效性,影响已经完成的阶段。首先要保证状态无后效性,否则一定是不对的。其次是状态转移方程可以正推,也可以逆推。

总结:动态规划看起来是一个很好理解的算法,但是一旦你深入到题中时会发现自己啥都想不出来。你先要确定这个题目后面的决策不会影响前面的,即无后效性,当然这个其实很难想,其次也是最难的一点,确定状态转移方程。他很多题目你很好理解,但是做起来思路全无,就很难找到突破口。总的来说吧,动态规划很不容易学,需要看很多的题目,多了解更多的解题思路和方式。

二.多个背包问题:

1.01背包问题:

问题:有n种物品,每个物品只有一件(有对应的重量和价值),放入一个限容的背包,求最大价值

很显然f [ i , v ] 就设为从前 i 件物品中选择放入容量为 v 的背包最大的价值。那么状态转移方程为:

f[i][v]=max{ f[i-1][v],f[i-1][v-w[i]]+val[i] }

存在两种状态:

           第一种是第i件不放进去,这时所得价值为:f_{i-1, v}

           第二种是第i件放进去,这时所得价值为:f_{i-1,v-c_{i}} + w_{i}

只考虑子问题“将前 i 个物品放入容量为 v 的背包中的最大价值”那么考虑如果不放入 i ,最大价值就和 i 无关,就是 f[ i - 1 ][ v ] , 如果放入第 i 个物品,价值就是 f[ i - 1][ v - w[i] ] + val[ i ]),然后取最大值

for i = 1..N

   for v = V..0  //注意:此处是从大到小的顺序

     f[ v ] = max{ f[ v ],f[ v-w[i] ]+val[ i ] };

2.完全背包问题:

有n种物品,每种物品都有无限件(与01背包和多重背包不同点),每种物品都有对应的价值和重量,取物品放入限容背包中,求最大价值
完全背包问题与0/1背包问题不同之处在于其每个物品是无限的,从而改变了取物品的方法(不仅仅是每种物品取与不取的决策),取法相关策略就变成了取0件、1件、2件…在01背包基础上,令f[i][v]表示前 i 种物品恰放入一个容量为 v 的背包的最大权值。则状态转移方程:

f[ i ][ v ] = max{ f[ i-1 ][ v-kw[i] ] + kval[ i ] | 0 <= k*w[i] <= v}

for i = 1..N

   for v = 0..V(注意:此处遍历顺序为从小到大)

     f[v] = max{f[v],f[v-w[i]] + val[ i ] };

3.多重背包问题:

有n种物品,每件物品都有有限个,将物品放入限容背包,求装满时的最大/小价值或判断能否装满背包

对于第i种物品有n[i]+1种策略:取0件,取1件……取n[i]件。令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值,状态转移方程为:

f[i][v]=max{ f[ i-1 ][ v-kw[i] ] + kval[ i ] | 0<= k <= n[ i ]}

4.分组背包问题:

分组背包问题是在01背包的基础上又进行了延伸,01背包问题中每个物品要么选要么不选,在分组背包中,将一系列物品分成几组,一次在一个小组中选择一个或者不选,其实01背包是一种特殊情况下的分组背包,即每个组只有一个物品时的分组背包,我们依然可以沿用01背包的解题思路,只不过进行一下加工,这里直接取一维情况的dp数组,其实我们可以这样认为,每个组既然只能选一个,我们可以先限定一个组别,之后在这个组别中,在总重量允许的条件下,看当前重量下是不是放得下这个组中的物品,放得下就选取价值的更大值。由于每次选择的都是最大值而且是在这一个组中进行的操作,所以保证了一个组中只选择了一个物品。由于分组背包是01背包延伸来的,所以依然是用逆序遍历来实现一维数组的dp。

总结:

总的来说,这四类背包问题的关系大致如下:
01背包:每个物品只有一个,要么选要么不选
完全背包:在01背包基础上解除了只有一个的限制,每个物品随便选
分组背包:嵌套的01背包,每组要么选一个要么不选,每组里面的物品只能选一个,也可以理解为最大数量为1的要么选要么不选
多重背包:在完全背包上加了数量的限制,依然是随便选,但不能超过限制。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值