动态规划、KMP、贪心算法

动态规划算法

在这里插入图片描述

核心思想:将大问题划分为小问题进行解决,经分解得到子问题往往不是相互独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上进行下一步的求解),可以通过填表的方式来逐步推进得到最优解

填表过程:

在这里插入图片描述

设定一个二维数组,行表示物品,列表示物品的重量,注意物品放入背包不能重复

(1)先填写只有吉他的情况,背包的重量从1到4的所有情况

(2)再填写有吉他和音响的情况

​ (2.1)判断音响重量是否能放入对应的书包,若能存放则直接存放

​ (2.2)若无法存放,则从上一行结果进行拷贝(eg:音响重量为4大于背包总重量为1的情况,则只能从上一行进行数据拷贝)

(3)再填写既有吉他又有音响还有电脑的情况

​ (3.1)判断电脑重量是否能放入对应的书包,若刚好能存放则直接存放

​ (3.2)若电脑无法存放,则从上一行结果进行拷贝

​ (3.3)若电脑存放后还有剩余空间,首先取电脑重量 + 背包剩余重量对应的上一行数据的总重量作为方案一(eg:背包为4,电脑2000 + 剩余重量1的对应上一行音响的数据1500),再取上一行音响相同重量4的数据为方案二,通过max函数求出方案一和方案二的最大值

公式推导:

定义循环遍历到的第i个物品,设置w[i]为重量,v[i]为价值,C为背包的总容量。二维数组a[i] [k]表示前i个物品能够装入到容量为K的背包中的最大价值,其中K为变量(取值范围从1到C)

(1)当a[i] [0] = a[0] [k] = 0 表示二维数组(结果表)第一行和第一列是0

(2)当w[i] > k,a[i] [k] = a[ i -1] [k] 当待加入物品重量大于当前背包容量时,从上一行单元格进行数据拷贝

(3)当 k >= w[i] ,a[i] [k] = max{ a[i-1] [k] ,v[i] + a [i - 1] [ k - w[i] ] }

v[i-1] [k]:上一行单元格数据拷贝 即方案一

v[i] :当前商品价值

v [i - 1] [ k - w[i] ]:上一行单元格对应背包对应剩余空间( k - w[i])的值

v[i] + v [i - 1] [ k - w[i] ] : 当前商品价值 + 上一行单元格对应背包对应剩余空间( k - w[i])的值 即方案二

使用max方法 从方案一和方案二中取最大值

注意:使用上一行单元格数据拷贝就是因为下一个子阶段的求解是建立在上一个子阶段的解的基础上进行下一步的求解

代码实现

填表:

在这里插入图片描述

在这里插入图片描述

KMP算法

字符串:bread

前缀:b br bre brea

后缀:read ead ad a

KMP就是通过next数组来保存字符串(待查找的子串)前后最长公共子序列的长度,然后匹配过程中进行回溯时,通过next数组找到前面匹配过的位置

回溯时移动位数 = 已匹配的字符数 - 对应的部分匹配值

在这里插入图片描述

在这里插入图片描述

求字符串的部分匹配值表:

在这里插入图片描述

KMP算法实现字符串匹配:

在这里插入图片描述

测试:

在这里插入图片描述

贪心算法

在这里插入图片描述

在这里插入图片描述

思路:

(1)将待覆盖的地区合并到集合allAreas中

(2)循环遍历所有广播台,求出对应广播台覆盖地区与allAreas中的交集数量最多的广播台,此时将maxKey指向该广播台

(3)将该广播台加入到待选择的集合selects中

(4)第一次循环完后,将allAreas中移除已添加广播台覆盖区域,并将maxKey置空方便下次使用

eg:此时allAreas中没有北京、上海、天津,selects中存在k1

(5)重复上诉步骤持续循环完广播台

代码实现:

初始化广播电台与待覆盖地区集合
在这里插入图片描述

贪心算法进行计算:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值