动态规划之二维费用的背包问题解析

以leetcode474题为例引出概念

题目解析: 

给一个m和一个n,m表示最多有多少个0,n表示最多有多少个1,

选出来的子集,记录0和1的个数,在不超过的情况下能选的最大子集,也就是能选多少个元素

从这里,如果观察敏锐的话,可以发现这是一个背包问题,就是选一堆东西,不能超过巴拉巴拉

但这里是有两个背包,也就是m和n,所以这就叫二维背包问题

就是由原来的一个体积限制,到现在的体积和重量限制

m和n就是两个限制

算法原理:

类比我们就可以推出状态表示

 

 通过前面的学习,我们已经可以快速的写出状态表示方程

注意:用a表示str[i]中的0的个数,用b表示1的个数

注意:只有当j>=a&&k>=b时才存在第二种

然后对这两种情况取最大值即可

初始化:

我们发现在填表的时候哪个地方会越界就初始化哪

但是根据我们前面的学习,当j==0和k==0时是不用初始化的,因为会判断

只有当i=0时需要初始化,根据状态表示,i=0表示数组里面有0个子串,不能超过j和k,所以填0

建表的时候就会自动初始化为0,所以不用单独填

 

代码编写: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值