首页 > 编程语言 >算法分析-动态规划-求解0-1背包问题

算法分析-动态规划-求解0-1背包问题

时间:2023-12-20 20:45:45浏览次数:28  
标签:背包 capacity 求解 选择 算法 物品 dp

一.题目需求

 

使用一个体积大小为13的背包,选择一件或多件商品带走,使得所选商品总价值最大。

商品列表如下:

 二.算法思想

1,这是一个经典的0-1背包问题

它要求我们在一组物品中选择一些,每个物品只能选择一次或者不选择,目标是使得所选物品的总价值最大。
这个问题在实际生活中有很多应用,比如旅行行李打包、资源分配等。本文将深入探讨0-1背包问题的算法分析。

2,0-1背包问题的基本定义
假设我们有n个物品和一个容量为V的背包,每个物品i有一个价值vi和一个重量wi。
我们的目标是在不超过背包容量的情况下,选择一些物品使得总价值最大。这就是0-1背包问题的定义。

3,解决这个问题的一种常见方法是动态规划

动态规划是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
对于0-1背包问题,我们可以定义一个二维数组dp[i][j],表示前i个物品中选择一些物品放入容量为j的背包可以获得的最大价值。
然后,我们可以通过比较物品的价值和重量来决定是否选择这个物品,从而更新dp数组。

4,具体的算法步骤如下

4.1. 初始化dp数组,dp[i][j] = 0,对于所有i和j。
4.2. 对于每个物品i,遍历所有可能的背包容量j(从0到V),如果物品i的重量小于等于j,那么考虑两种情况:选择物品i或者不选择物品i。
  如果选择物品i,那么dp[i][j] = max(dp[i][j], dp[i-1][j-wi] + vi);
  如果不选择物品i,那么dp[i][j] = dp[i-1][j]。
4.3. 最后,dp[n][V]就是我们要求的答案,即在不超过背包容量的情况下,选择一些物品可以获得的最大价值。

5.算法分析

这个算法的时间复杂度是O(nV),其中n是物品的数量,V是背包的容量。这是因为我们需要遍历所有的物品和背包容量来更新dp数组。
空间复杂度也是O(nV),因为我们需要存储整个dp数组。

6.列表分析结果

 

.编程实现

def knapsack_json_list(goods_list, capacity):
    '''
    用动态规划算法实现0/1背包问题
    该算法的时间复杂度为O(n * capacity),其中n为物品数量,capacity为背包容量。空间复杂度为O(n * capacity)。
    '''

    nums = len(goods_list)
    dp = [[0 for c in range(capacity + 1)] for _ in range(nums + 1)]
    for i in range(1, nums + 1):
        for c in range(1, capacity + 1):
            weight = goods_list[i - 1]["weight"]
            value = goods_list[i - 1]["value"]
            # 当前商品重量小于等于当前背包容量,则选择商品
            if weight <= c:
                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - weight] + value)
            else:
                dp[i][c] = dp[i - 1][c]
    # 记录决策过程
    print("最优方案,价值决策过程为:")
    c = capacity
    for i in range(nums, 0, -1):
        if dp[i][c] != dp[i - 1][c]:
            print('选择商品:%s, 价值:%s, 重量:%s' % (
                goods_list[i - 1]["name"], goods_list[i - 1]["value"], goods_list[i - 1]["weight"]))
            c -= goods_list[i - 1]["weight"]
    return dp[-1][-1]


if __name__ == "__main__":

    # 商品列表
    goods_list = [{"name": "饼干", "value": 9, "weight": 4},
                  {"name": "面包", "value": 10, "weight": 5},
                  {"name": "牛奶", "value": 9, "weight": 4},
                  {"name": "汽水", "value": 2, "weight": 3},
                  {"name": "啤酒", "value": 24, "weight": 10},
                  ]
    # 背包容量
    capacity = 13
    # 最优方案,总价值28,总体积13
    rsp_new = knapsack_json_list(goods_list, capacity)
    print("最大价值为:", rsp_new)

.运行结果

 ==================================end ==================================

 

标签:背包,capacity,求解,选择,算法,物品,dp
From: https://www.cnblogs.com/xh2023/p/17917512.html

相关文章

  • 【算法】决策树算法:ID3
    importmathfromcollectionsimportCounter#创建数据集defcreate_dataset():dataset=[#年龄,工作,房子,信用,标签['青年',0,0,'一般','0'],['青年',0,0,'好','0'],[�......
  • 安防升级!羚通视频智能分析平台助力安全帽、反光衣算法识别,让安全无处不在!
    在现代社会中,公共安全和个体防护已经成为了我们日常生活的重要组成部分。特别是在一些高风险的工作环境中,如建筑工地、交通警察等,安全帽和反光衣的使用是保障工作人员安全的重要手段。然而,传统的人工监控方式往往无法做到实时、准确的监控和识别,这就为羚通视频智能分析平台的出现......
  • 【算法】K-means 算法学习
    fromnumpyimport*importpandasaspdimportmatplotlib.pyplotasplt#计算两点之间的欧式距离defdist(a,b):returnsqrt(sum((a-b)**2))#生成聚类中心defcreate_center(data,k,defaultPts=[0,3,6]):#固定的几个点作为聚类中心ifdefaultP......
  • 羚通视频智能分析平台视频监控算法分析玩手机打电话检测
    在当今数字化时代,视频监控技术已经广泛应用于我们生活的各个领域。然而,传统的视频监控方式往往需要大量的人力进行监控和分析,这不仅效率低下,而且容易出错。为了解决这个问题,羚通公司推出了一款全新的视频智能分析平台,该平台利用先进的视频监控算法,可以实时检测并分析手机打电话的......
  • 《算法、C++、Linux、Android》
    ......
  • 羚通视频智能分析平台视频监控算法分析玩手机打电话检测
    在当今数字化时代,视频监控技术已经广泛应用于我们生活的各个领域。然而,传统的视频监控方式往往需要大量的人力进行监控和分析,这不仅效率低下,而且容易出错。为了解决这个问题,羚通公司推出了一款全新的视频智能分析平台,该平台利用先进的视频监控算法,可以实时检测并分析手机打电话的行......
  • python 数据结构与算法知识图
    1.算法思想:递归、分治(归并排序、二分查找、快速排序)、贪心(贪心策略排序+当前最优)、动态规划(最优子结构+递推式)、回溯(解空间:排列树+子集树、深度搜索+剪枝)、分支限界(解空间:排列树+子集树、广度搜索+剪枝))2.排序算法:(low:冒泡、插入、选择;mid:快排、归并、堆排(完全二叉树),其他:桶排序、基......
  • 2023最新初级难度算法面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-初级难度算法面试题合集问:什么是排序?说出常见的排序算法有哪几种?排序是计算机科学中的一种基本操作,它将一组数据按照某种顺序进行排列。排序算法是实现排序过程的具体方法。常见的排序算法有多种,它们可以根据不同的数据结构、时间复杂......
  • 详解十大经典排序算法(五):归并排序(Merge Sort)
    算法原理归并排序的核心思想是将一个大的数组分割成多个小的子数组,然后分别对这些子数组进行排序,最后将排序后的子数组合并起来,得到一个有序的大数组。算法描述归并排序(MergeSort)是一种经典的排序算法,其原理基于分治(DivideandConquer)策略。它的核心思想是将一个大问题分割成多个......
  • 详解十大经典排序算法(四):希尔排序(Shell Sort)
    算法原理希尔排序是一种基于插入排序的排序算法,也被称为缩小增量排序。它通过将待排序的序列分割成若干个子序列,对每个子序列进行插入排序,然后逐步缩小增量,最终使整个序列有序。算法描述希尔排序(ShellSort)是一种基于插入排序的算法,由DonaldShell于1959年提出。它是插入排序的一种......