网站备案 邮寄资料哪个小说网站版权做的好
web/
2025/10/7 11:16:10/
文章来源:
网站备案 邮寄资料,哪个小说网站版权做的好,ui培训设计哪里好,个人网站开发平台有哪些问题分析子问题界定#xff1a;由参数 k 和 y 界定k#xff1a;考虑对物品1, 2, … , k 的选择 y#xff1a;背包总重量不超过 y 原始输入#xff1a;k n, y b 子问题计算顺序#xff1a; k 1, 2, … , n 对于给定的 k#xff0c;y 1, 2, … , b 定义问题 假设有 n 个…问题分析子问题界定由参数 k 和 y 界定k考虑对物品1, 2, … , k 的选择 y背包总重量不超过 y 原始输入k n, y b 子问题计算顺序 k 1, 2, … , n 对于给定的 ky 1, 2, … , b 定义问题 假设有 n 个物品和一个最大承重为 W 的背包。每个物品 i 有一定的重量 wi 和价值 vi。我们的目标是选择一些物品装入背包使得总重量不超过 W且总价值最大。 动态规划数组定义 定义一个二维数组 dp其中 dp[i][j] 表示从前 i 个物品中选取一些使得总重量不超过 j 时的最大价值。 初始条件 初始化 [0][]0对所有 j 成立因为没有物品时无论背包容量如何可装入的最大价值都是 0。
转移方程 对于每个物品 i 和每种背包容量 j 如果不选择物品 i则 dp[i][j]dp[i−1][j] 如果选择物品 i前提是 ≥i则 dp[i][j]max(dp[i−1][j],dp[i−1][j−wi]vi) dp[i][j]max(dp[i−1][j],dp[i−1][j−wi]vi) 这个方程的含义可以这样理解
dp[i−1][j]: 这部分表示如果我们不选择当前的物品 i则问题就退化为“从前i−1 个物品中选择背包容量为 j 的情况”。在这种情况下我们已经在上一个状态计算出了不包括物品 i 时的最大价值。dp[i−1][j−wi]vi: 这部分表示如果我们选择了当前的物品 i则背包剩余的容量将减少 wi物品 i 的重量因此我们需要考虑的子问题变为“从前 i−1 个物品中选择背包容量为 j−wi 的情况”。由于我们选择了物品 i我们必须在此基础上加上物品 i 的价值 vi。
def knapsack(n, b, v, w)::param n: 物品有n种:param b: 背包容量:param v: 物品价值:param w: 物品重量:return: 最大价值# 初始化V [[0 for _ in range(b 1)] for _ in range(n 1)] # V[i][j] 表示前i个物品放入容量为j的背包的最大价值for i in range(n 1): # 应该到n1包含所有物品for j in range(b 1): # 应该到b1包含背包的完整容量if i 0 or j 0: # 初始化 当i0或j0时表示前i个物品放入容量为j的背包的最大价值为0V[i][j] 0elif j w[i - 1]: # 注意这里的索引应该是i-1因为列表是从0开始 表示前i个物品放入容量为j的背包的最大价值为前i-1个物品放入容量为j的背包的最大价值V[i][j] V[i - 1][j]else: # 当jw[i-1]时选择放入物品i或不放入V[i][j] max(V[i - 1][j], V[i - 1][j - w[i - 1]] v[i - 1])# 回溯部分solution []i, j n, bwhile i 0 and j 0:if V[i][j] ! V[i - 1][j]: # 如果选择了物品isolution.append(i - 1) # 添加物品i到解决方案 列表中 因为索引从0开始 所以要减1j - w[i - 1] # 更新剩余背包容量i - 1 # 更新物品索引else: # 如果V[i][j]等于V[i - 1][j]这意味着第i个物品没有被选中因为不考虑这个物品我们可以得到相同的最大价值。因此只需要简单地将物品索引i减1继续考虑下一个物品。i - 1# 返回最大价值和选择的物品列表return V[n][b], [v[i] for i in reversed(solution)]if __name__ __main__:n 4b 10v [1, 3, 5, 9]w [2, 3, 4, 7]max_value, solution knapsack(n, b, v, w)print(f最大价值为: {max_value})print(f选择的物品: {solution})
回溯部分从V[n][b]开始通过比较当前状态V[i][j]和V[i - 1][j]来判断是否将第i个物品放入背包中。如果当前状态的价值不是由前一个物品的价值转移而来说明第i个物品没有被选中否则第i个物品被选中更新背包容量j并继续回溯。 4. 在循环体内首先检查V[i][j]和V[i - 1][j]的值。这两个值的含义如下 ○ V[i][j]考虑前i个物品背包容量为j时的最大价值。 ○ V[i - 1][j]考虑前i - 1个物品背包容量为j时的最大价值。 5. 如果V[i][j]不等于V[i - 1][j]这意味着在将第i个物品放入背包时我们得到了更高的价值。因此执行以下操作 ○ 将物品i - 1因为数组是从0开始索引的添加到解决方案列表solution中。 ○ 从剩余背包容量j中减去物品i - 1的重量w[i - 1]因为背包中加入了这个物品。 ○ 将物品索引i减1继续考虑下一个物品。 6. 如果V[i][j]等于V[i - 1][j]这意味着第i个物品没有被选中因为不考虑这个物品我们可以得到相同的最大价值。因此只需要简单地将物品索引i减1继续考虑下一个物品。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/88442.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!