动态规划——使用python解决01背包问题

这篇具有很好参考价值的文章主要介绍了动态规划——使用python解决01背包问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

什么是01背包问题?

题目:

输入格式:

输出格式:

代码实现:

代码执行示例:

代码解析:


什么是01背包问题?

        01背包问题是一个经典的组合优化问题,通常用于描述如下情境:假设有一个背包,它能够承受一定的重量上限(即背包容量),同时有一组物品,每件物品有自己的重量和价值。问题的目标是决定如何选择装入背包的物品,使得装入的物品的总价值最大,并且不能超过背包的承重上限。

        在01背包问题中,每件物品要么被完全装入背包(即选中),要么不被装入背包。这就是为什么它被称为“01”背包问题,其中“01”表示对每个物品的选择只有两种状态。这种限制条件使得问题具有一定的复杂性,需要采用动态规划等方法来解决。

         因此,01背包问题是一个经典的组合优化问题,它在实际生活中有着广泛的应用,例如在资源分配、投资决策等领域中都能够找到具体的应用案例。

题目:

       假设你有一个背包,它的容量是有限的。有一些物品,每个物品都有自己的重量和价值。你的任务是选择物品,将它们放入背包中,使得背包的重量不超过其容量,同时最大化背包中物品的总价值。

示例:

        假设你有一个承重量为W的背包,同时有n件物品和它们的重量数组weights[]以及价值数组values[]。请编写一个程序,找出能够装入背包的最大总价值,并输出这个最大总价值。

输入格式:

输入物品的数量:n

输入第一个物品的重量和价值(请使用空格分隔开):x1  y1

输入第二个物品的重量和价值(请使用空格分隔开):x2  y2

输入第三个物品的重量和价值(请使用空格分隔开):x3  y3

.....................

输入第 n 个物品的重量和价值(请使用空格分隔开):xn  yn

输出格式:

最大价值:

选中的物品:

代码实现:

def knapsack(weights, values, capacity):
    n = len(weights)
    dp = [[0] * (capacity + 1) for _ in range(n + 1)]

    for i in range(1, n + 1):
        for w in range(1, capacity + 1):
            if weights[i - 1] > w:
                dp[i][w] = dp[i - 1][w]
            else:
                dp[i][w] = max(dp[i - 1][w], values[i - 1] + dp[i - 1][w - weights[i - 1]])

    selected = []
    w, v = capacity, dp[n][capacity]
    for i in range(n, 0, -1):
        if dp[i][w] != dp[i - 1][w]:
            selected.append(i)
            w -= weights[i - 1]

    return dp[n][capacity], selected[::-1]

# 输入数据
n = int(input("请输入物品的数量: "))
weights = []
values = []
for i in range(n):
    weight, value = map(int, input("请输入第{}个物品的重量和价值(空格分隔): ".format(i + 1)).split())
    weights.append(weight)
    values.append(value)
capacity = int(input("请输入背包的容量: "))

# 求解01背包问题
max_value, selected_items = knapsack(weights, values, capacity)

# 输出结果
print("最大价值:", max_value)
print("选中的物品:", [item for item in selected_items])

代码执行示例:

输入:

用python编写一个应用动态规划算法实现的0\1背包问题,python,动态规划

输出:

用python编写一个应用动态规划算法实现的0\1背包问题,python,动态规划

代码解析:

这段代码实现了一个解决01背包问题的动态规划算法。

def knapsack(weights, values, capacity):
    n = len(weights)
    dp = [[0] * (capacity + 1) for _ in range(n + 1)]

    for i in range(1, n + 1):
        for w in range(1, capacity + 1):
            if weights[i - 1] > w:
                dp[i][w] = dp[i - 1][w]
            else:
                dp[i][w] = max(dp[i - 1][w], values[i - 1] + dp[i - 1][w - weights[i - 1]])

    selected = []
    w, v = capacity, dp[n][capacity]
    for i in range(n, 0, -1):
        if dp[i][w] != dp[i - 1][w]:
            selected.append(i)
            w -= weights[i - 1]

    return dp[n][capacity], selected[::-1]
  1. 输入参数:weights(物品的重量),values(物品的价值),capacity(背包的最大容量)。
  2. 初始化一个二维列表dp,用于存储每个物品在不同重量限制下可以获得的最大价值。这个列表的每个元素dp[i][j]表示在前i个物品、重量限制为j的情况下可以获得的最大价值。所有元素初始化为0。
  3. 两个嵌套循环遍历每个物品和每个可能的重量限制。如果第i个物品的重量weights[i-1]大于当前的重量限制w,那么选择这个物品无法提高总价值,因此dp[i][w] = dp[i-1][w]。否则,需要在不选择第i个物品(dp[i-1][w])和选择第i个物品(dp[i-1][w-weights[i-1]] + values[i-1])之间做出选择,取二者中较大的值作为dp[i][w]的值。这样可以保证在给定前i个物品和重量限制w的情况下,dp[i][w]的值总是非负的且是最大的。
  4. 初始化一个空列表selected,用于存储被选中的物品的索引。同时初始化变量w和v,分别表示当前的重量限制和在给定前n个物品和重量限制capacity下可以获得的最大价值。
  5. 反向遍历物品列表,从最后一个物品开始向前遍历。如果当前物品的加入能够提高总价值(dp[i][w] != dp[i-1][w]),则将当前物品的索引添加到selected列表中,并更新重量限制w。这样可以确定在给定前i个物品和重量限制w的情况下被选中的物品。
  6. 返回在给定前n个物品和重量限制capacity下可以获得的最大价值dp[n][capacity]和被选中的物品的索引列表selected[::-1],其中[::-1]表示逆序输出列表。
  7. 算法的时间复杂度是O(nC),其中n是物品的数量,C是背包的最大容量。
n = int(input("请输入物品的数量: "))
weights = []
values = []
for i in range(n):
    weight, value = map(int, input("请输入第{}个物品的重量和价值(空格分隔): ".format(i + 1)).split())
    weights.append(weight)
    values.append(value)
capacity = int(input("请输入背包的容量: "))

# 求解01背包问题
max_value, selected_items = knapsack(weights, values, capacity)

# 输出结果
print("最大价值:", max_value)
print("选中的物品:", [item for item in selected_items])

通过主程序,输入物品数量n,再使用for循环,依次输入每个物品重量weights,物品价值values,最后再输入背包的容量capacity,再调用knapsack函数,将函数的返回值dp[n][capacity]即可得到背包能够容纳的最大价值,通过回溯的方式确定选中的物品。从最后一个物品开始,如果dp[i][w]不等于dp[i-1][w],则说明选择了第i个物品,将其索引加入selected列表,并且更新背包容量w。最后将最大价值和选中的物品打印出来。文章来源地址https://www.toymoban.com/news/detail-768058.html

到了这里,关于动态规划——使用python解决01背包问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【动态规划专栏】-- 01 背包问题 -- 动态规划经典题型

    目录 背包问题概述 01 背包问题 01背包⭐⭐  【算法原理】 第一问 第二问 C++ 算法代码 复杂度分析 【空间优化 - 滚动数组】 C++ 算法代码 复杂度分析 分割等和子集⭐⭐ 【算法原理】  对于类01背包问题 C++ 算法代码  【空间优化 - 滚动数组】  C++ 算法代码 目标和⭐⭐ 【算

    2024年02月05日
    浏览(54)
  • 动态规划(01背包问题)

    本文默认读者具有动态规划前置知识 动态规划的特点: 重叠子问题 状态转移方程 最优子结构 题型: 求最值 解题套路: 明确【状态】 明确【选择】 明确dp函数/数据的定义 明确base case 例:给你一个可装载容量为W的背包和N个物品,每个物品有重量和价值两个属性。其中第

    2024年04月16日
    浏览(37)
  • 动态规划——01背包问题

    由于本人实力尚浅,接触算法没多久,写这篇blog仅仅是想要提升自己对算法的理解,如果各位读者发现什么错误,恳请指正,希望和大家一起进步。(●’◡’●) 状态表示 :用一个数组 f[][] (数组可能是一维也可能是二维,根据具体题目具体分析)来表示某个集合,这个集合

    2024年02月03日
    浏览(42)
  • 动态规划01背包问题

    假设你是一名经验丰富的探险家,背着背包来到野外进行日常探险。天气晴朗而不燥热,山间的风夹杂着花香,正当你欣赏这世外桃源般的美景时,突然,你发现了一个洞穴,这个洞穴外表看起来其貌不扬,但凭借着惊为天人的直觉,这个洞穴不简单。于是,你开始往洞穴内

    2024年02月06日
    浏览(41)
  • 动态规划_01背包问题

    描述 一个旅行者有一个最多能装   M   公斤的背包,现在有   n   件物品,它们的重量分别是   W 1 ​ , W 2 ​ , ... , W n ​ , 它们的价值分别为   C 1 ​ , C 2 ​ , ... , C n ​ ,求旅行者能获得最大总价值。 输入描述 第 1 行:两个整数, M   (背包容量, M ≤ 200   )和   N  

    2024年04月29日
    浏览(39)
  • 【动态规划】01背包问题

    动态规划是一种非常常见的算法,不论是在我们平时刷题的过程中还是在竞赛中,总会见到动态规划的身影,而动态规划又分为很多种,其中01背包问题是非常典型的一类动态规划问题。如果大家之前没有了解过动态规划,建议大家先去学习学习动态规划,直接开始01背包问题

    2024年04月15日
    浏览(47)
  • 动态规划-01背包问题

    算法思路: 背包问题的状态表⽰⾮常经典,如果⼤家不知道怎么来的,就把它当成⼀个「模板」记住吧~ 我们先解决第⼀问: 1. 状态表⽰ : dp[i][j] 表⽰:从前 i 个物品中挑选,总体积「不超过」 j ,所有的选法中,能挑选出来 的最⼤价值。 2. 状态转移⽅程 : 线性 dp 状态

    2024年04月11日
    浏览(42)
  • 动态规划:01背包问题(二)

    上篇博客动态规划:01背包问题(一)将的是用二维数组来解决,而本篇博客就是把二维dp数组降为一维dp数组(滚动数组)在使用二维数组的时候,递推公式:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); 其实可以发现如果 把dp[i - 1]那一层拷贝到dp[i]上 ,表达式完全可以是

    2024年01月22日
    浏览(58)
  • 算法系列--动态规划--背包问题(1)--01背包介绍

    💕\\\"趁着年轻,做一些比较cool的事情\\\"💕 作者:Lvzi 文章主要内容:算法系列–动态规划–背包问题(1)–01背包介绍 大家好,今天为大家带来的是 算法系列--动态规划--背包问题(1)--01背包介绍 背包问题是动态规划中经典的一类问题,经常在笔试面试中出现,是非常 具有区分度 的题

    2024年04月16日
    浏览(50)
  • 动态规划—— 01背包问题(一维,二维)

    0-1背包问题是一个经典问题,特别是在算法和动态规划领域。问题是关于一个小偷,他有一个可以携带最大重量的背包,并且他有一组物品,其中每个物品都有自己的价值和重量。小偷希望在不超过背包所能承载的最大重量的情况下,最大化他从这些物品中获得的总价值。问

    2024年02月19日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包