021.【动态规划算法】

文章介绍了动态规划算法的基本思想,它通过解决子问题来逐步构建原问题的解。以背包问题为例,当有多个物品和有限的背包容量时,如何选择物品以达到最大价值。动态规划能有效地解决这个问题,避免了重复计算。文章给出了一个Python实现的动态规划函数`bag()`,用于计算最大价值,并通过`show()`函数展示结果。
摘要由CSDN通过智能技术生成

1. 动态规划算法

动态规划算法是将待解决的问题拆分成一系列相互交叠的子问题,它的基本思想与合并排序算法类似,也是将待求解的问题分解为若干个子问题(阶段)。动态规划算法需要按顺序求解子问题,前一子问题的解为后一子问题的求解提供了有用的信息。在求解任何一个子问题时,都要列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题后,那么最后一个子问题就是初始问题的解。简单来说,就是不要让程序做重复的事情。

2. 背包问题

有n件物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值。装包条件是一种商品只能装一个。

在这里插入图片描述
最简单的方法是尝试使用各种可能的物品组合,找出价值最高的组合。

这种办法是可以的,但是速度非常慢,对于三件物品就需要8次不同组合比较。如果有四件物品,则需要计算更多的组合。很显然,当物品数量增多时,简单组合方法的速度会变慢,从最优算法角度考虑,这种算法是不可行的。接下来通过动态规划算法快速地找出最优组合。

动态规划算法就是将大问题变成小问题,通过解决小问题逐步解决大问题。因此将大背包变成小背包问题,按照物品的重量分成小背包(即1kg、2kg、3kg、4kg的小背包)。

在这里插入图片描述在这里插入图片描述
通过公式计算出每个单元格的价值,并最终得到最大价值的过程就是将大问题拆成小问题,最后再合并大问题,从而得出了大问题的解。而这个解题的过程就是动态规划算法。

在这里插入图片描述
接下来用Python代码来实现“背包问题”,具体代码如下:

"""
功能:自定义背包函数,实现动态规划算法
参数说明: 	count:表示物品件数
          	TotalWeight:表示背包的总容量
          	weight:表示每件物品的重量
          	cost:表示每件物品的价值
"""

def bag(count, TotalWeight, weight, cost):
# 置零,表示初始状态
value = [[0 for j in range(TotalWeight + 1)] for i in range(count +1)]
    for i in range(1, count+1):                     		# 遍历物品件数,从第1件物品计算
        for j in range(1, TotalWeight + 1):            		# 遍历背包容纳量,从重量为1开始计算
            value[i][j] = value[i - 1][j]              		# 定义value数组存储最大价值
            # 背包总容量够放当前物体,遍历前一个状态考虑是否置换
            if j >= weight[i - 1] and value[i][j] < value[i - 1][j - weight[i - 1]] + cost[i - 1]:
                # 最大价值:当前物品的价值+剩余空间的价值
                value[i][j] = value[i - 1][j - weight[i - 1]] +cost[i - 1]
    for x in value:                             			# 遍历输出背包网格
        print(x)
    return value                              				# 返回最大价值

"""
功能:自定义显示输出结果函数
参数说明:	count:表示物品件数
          	TotalWeight:表示背包的总容量
          	weight:表示每件物品的重量
          	value:表示最大价值,即所求的结果
"""

def show(count, TotalWeight, weight, value):
    x = [False for i in range(count)]                  		# 初始化x,使得x为假
    j = TotalWeight                          				# 背包的容量赋给变量j
    for i in range(count, 0, -1):                     		# 遍历每个物品
        # 如果value[i][j]单元格大于上一行同列的单元格的价值,进行更新
        if value[i][j] > value[i - 1][j]:               
            x[i - 1] = True
            j -= weight[i - 1]                  			# 总容量减去上一行同列的单元格的重量
    print('最大价值为:', value[count][TotalWeight]) 			# 输出最大价值的值
    print('背包中所装物品为:')
    for i in range(count):                               	# 遍历物品数
        if x[i]:                                    		# 判断最大价值的物品数
            print('第', i + 1, '个 ', end='')        		# 输出是第几个物品


count = 3                                   				# 一共有3件物品
TotalWeight = 4                             				# 背包的总容量是4
weight = [1, 4, 3]                             				# 每个物品的重量
cost = [4900, 7800, 5600]                       			# 每个物品的价值
value = bag(count, TotalWeight, weight, cost)          		# 调用bag()函数动态规划算法函数
show(count, TotalWeight, weight, value)            			# 调用show()函数输出结果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值