典型DP_背包问题

屈奶奶《算法设计与分析》学习笔记1

 

问题主观描述:一个背包(可能有重量或体积限制,根据限制条件可分为多种类型),n种物品(线性约束条件对应于背包),选物品放到背包里得到最优方案。

复杂性:NP难(即不能找到多项式算法,近似算法在之后的第八章介绍)

        对NP难的解释:考虑完全背包问题(n种物品,每种可供选的物品数量有无限多,背包限制只有一维重量b),看起来时间复杂度为O(n*b),但实际上输入规模是n和logb(因为计算机中用二进制来存储数据,logb是b的二进制表示的位数)。“显然O(nb)不是n和Logb的多项式函数,这样的算法称为伪多项式时间的算法。”

 

一、算分作业三题

      书中典例为完全背包问题,递推方程为f[i][j] = max{ f[i - 1][j], f[i][j - w[i]] + v[i] (j >= w[i]) }(注意第二项中为f[i][...],而非f[i-1][...])

                        对比0-1背包问题递推方程:f[i][j] = max{ f[i - 1][j], f[i-1][j - w[i]] + v[i] (j >= w[i]) }

3.5 就跟例题几乎一样,只不过将重量和价值调换位置,递推方程也改成min,手动画出备忘录表和标记函数表,两个表应该同时画,相当于人脑去执行这个程序。

3.7 背包限制拓展到重量和体积两维,最终为f[i][j][k]...

3.13下载问题

       思路1:相当于重量和价值合为一体,做法相同,f[i][j] = max{ f[i-1][j], f[i-1][j-a[i]] + a[i]};f[1][j] = 0 (j < a[1]), f[1][j] = a[1] (j>= a[1])

 注意这里的f[i][j]表示考虑前i个申请,限制带宽为j时的最大带宽使用量,即所取的sum(a[i])不大于j

       思路2:f[i][j]表示考虑前i个申请,sum(a[i]) = j是否可行,只有0和1两种状态,未经验证,比思路1的 缺点在于不好写标记函数,直接逆推可以有多个解

 

二、经典背包问题九讲拓展

还没好好看,注意不同问题中f[i][j]的定义是不大于j,还是恰好=j,涉及到边界设定问题

背包问题九讲(转)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值