动态规划01背包问题

动态规划是解决01背包问题的一种常用方法。01背包问题是一个经典的组合优化问题,通常描述如下:

给定一组物品,每个物品有一个重量(weight)和一个价值(value),以及一个固定容量的背包。目标是选择一些物品放入背包中,使得放入的物品的总重量不超过背包容量,同时总价值最大化。

以下是解决01背包问题的动态规划算法的基本步骤:

创建一个二维数组 dp,其中 dpij 表示在考虑前 i 个物品,且背包容量为 j 的情况下的最大价值。

初始化边界条件:

当没有物品可选时,即 i=0,dp0j 应该都为0,因为没有物品可放入背包。

当背包容量为0时,即 j=0,dpi0 也应该都为0,因为不论有多少物品,背包容量为0时无法放入任何物品。

使用动态规划递推公式填充 dp 数组。递推公式如下:

如果当前考虑的物品重量大于背包的容量,即 weighti-1 > j,则 dpij = dpi-1j,表示不能放入当前物品,最大价值与前 i-1 个物品相同。

如果当前考虑的物品重量不大于背包的容量,即 weighti-1 <= j,则需要考虑放入或不放入当前物品两种情况。取两者中的较大值:

如果不放入当前物品,即 dpij = dpi-1j

如果放入当前物品,即 dpij = dpi-1j - weight\[i-1] + valuei-1,其中 valuei-1 表示当前物品的价值。

最终 dpnW 即为解决问题的答案,其中 n 表示物品的数量,W 表示背包的容量。

下面是一个简单的Python示例代码来解决01背包问题:

def knapsack_01(weights, values, capacity):

n = len(weights)

dp = \[0 * (capacity + 1) for _ in range(n + 1)]

for i in range(1, n + 1):

for j in range(1, capacity + 1):

if weightsi - 1 > j:

dpij = dpi - 1j

else:

dpij = max(dpi - 1j, dpi - 1j - weights\[i - 1] + valuesi - 1)

return dpncapacity

示例用法

weights = 2, 2, 3, 4, 5

values = 3, 4, 5, 6, 7

capacity = 7

print(knapsack_01(weights, values, capacity)) # 输出最大价值

这段代码将计算出给定物品和背包容量的情况下,可以获得的最大价值。

相关推荐
学究天人1 小时前
数学公理体系大全:第七章 连续统假设与力迫法简介
人工智能·算法·机器学习·数学建模·动态规划·图论·抽象代数
满怀冰雪8 小时前
第29篇-状态压缩DP-当状态很多时如何降维优化
java·算法·动态规划
学究天人1 天前
数学公理体系大全:第一章 命题逻辑:真值之舞
人工智能·算法·机器学习·数学建模·动态规划·图论·抽象代数
旖-旎1 天前
《LeetCode 978 最长湍流子数组 || LeetCode 139 单词拆分》
c++·算法·leetcode·动态规划
学究天人1 天前
数学公理体系大全:Comprehensive Collection of Mathematical Axiom Systems(补充卷9)
人工智能·线性代数·算法·数学建模·动态规划·原型模式·抽象代数
初学者,亦行者1 天前
算法设计与分析:动态规划 - TSP问题和0-1背包问题
c++·算法·动态规划
学究天人1 天前
数学公理体系大全:第二章 一阶谓词演算:进入“所有”与“存在”
网络·算法·数学建模·动态规划·图论·抽象代数·拓扑学
学究天人1 天前
数学公理体系大全:第四章 ZFC公理的形式化与构造演算
线性代数·数学建模·矩阵·动态规划·图论·抽象代数·拓扑学
旖-旎2 天前
《LeetCode 53 最大子数组和 || LeetCode 918 环形子数组的最大和》
c++·算法·leetcode·动态规划
c238562 天前
《动态规划:从“傻傻穷举”到“过目不忘”的修仙之路》
c++·算法·动态规划