实验内容
给定几组数据,利用动态规划算法的思想,把 0-1 背包装满并使得其价值最 大。
实验原理
动态规划通过拆分问题,将问题拆分成许多的子问题,定义问题状态和状态之间的关系(即状态转移方程或递推公式),使得问题能够以递推(或者说分治) 的方式去解决。按顺序求解子问题,前一子问题的解,为后一子问题的求解提供了有用的信息,在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,那么最后一个子问题就是初始问题的解。
实验步骤
① 把问题分解成若干个子问题,如背包仅可以容纳 1 个物品且可以容纳的质量为一等。
② 依次求出各个子问题的最优解。
③ 每个子问题的最优解又可以从它的子问题的最优解中得到。
④ 通过各个子问题的最优解得到原问题的最优解
代码实现
backpack函数:
weight 表示背包能容纳的商品最大重量,number 表示商品数量,w 数组和 v 数组表示每件商品的重量以及对应的价值。首先初始化二维数组为 0,最后循环将数组中的每个元素进行填充:如果当前背包可容纳的重量小于当前商品的重量,那么背包中的总价值不会变化,否则,可以选择装下当前这件物品或者不装下这件物品,这就可以得到两个价值,那么其中最高的价值就是当前情况下背包能获得的最大价值。
main 函数中最后的两个for循环(用于找到选择的物品):
首先初始化一个 item 数组并全初始化为 0,然后循环遍历动态规划得到的数组,如果 result[i][j] > result[i-1][j],那么说明第 i-1 件物品肯定被选择了,那么 就将 item[i-1]设置为 1,循环结束后将 item 中为 1 的索引输出即可。
import time
def backpack(number, weight, w, v):
#初始化二维数组,用于记录背包中个数为i,重量为j时能获得的最大价值
result = [[0 for i in range(weight+1)] for i in range(number+1)]
#循环将数组进行填充
for i in

本文介绍如何使用动态规划算法解决0-1背包问题,通过分解问题、定义状态和状态转移方程,实现最优解的求解。文章详细解释了算法原理,步骤和代码实现,最终得出最优解及选取的物品。
1269

被折叠的 条评论
为什么被折叠?



