7.1 动态规划背包问题综述

news2024/11/19 14:29:15

        动态规划中的背包问题是一类经典的优化问题,主要涉及到在给定的限制条件下(如背包容量),如何选择物品集合以达到某种最优目标(如价值最大)。这类问题通常可以细分为几种类型,包括0-1背包问题、完全背包问题、多重背包问题以及分数背包问题。下面是对这些类型的一个简要综述:

1. 0-1背包问题

        这是最基础的背包问题形式。每种物品只有一件,对于每件物品,只能选择放或不放。状态转移方程可以表示为:(状态只能是二维的);

其中,𝑓[𝑖][v]表示前i件物品中选择一些装入容量为V的背包可以获得的最大价值;

𝑤[𝑖]​是第i件物品的重量;c[𝑖]是第i件物品的价值。

说白了,如果装进入第i个物品与不装进物品的区别;这里要注意是从f[i-1][v-c[i]] 开始的;

 案例描述:

假设你有一个背包,它的容量是10公斤。现在你面前有4件物品,每件物品有特定的重量和价值:

  • 物品1:重量2公斤,价值3元
  • 物品2:重量3公斤,价值4元
  • 物品3:重量4公斤,价值5元
  • 物品4:重量5公斤,价值8元

你的目标是在不超过背包容量的情况下,使背包中物品的总价值最大化。

计算过程:

我们从零开始填充一个动态规划表,其行表示物品数量(从0开始),列表示背包的容量(从0到10)。初始状态为𝑓[0][∗]=0f[0][∗]=0(不考虑任何物品的情况)。

接下来,逐步填充表格:

  • 当前背包容量为0时,无论考虑哪件物品,价值都为0。
  • 考虑物品1(重量2,价值3):
    • 当背包容量小于2时,𝑓[𝑖][𝑗]=𝑓[𝑖−1][𝑗]f[i][j]=f[i−1][j]。
    • 当背包容量大于等于2时,𝑓[𝑖][𝑗]=max⁡(𝑓[𝑖−1][𝑗],𝑓[𝑖−1][𝑗−2]+3)f[i][j]=max(f[i−1][j],f[i−1][j−2]+3)。
  • 以此类推,直到所有物品都被考虑。

最终,𝑓[4][10]f[4][10]的值就是所求的答案。

def knapsack(capacity, weights, values, n):
    # 初始化二维数组
    dp = [[0 for _ in range(capacity + 1)] for _ in range(n + 1)]

    # 填充dp数组
    for i in range(1, n + 1):
        for j in range(1, capacity + 1):
            if weights[i-1] <= j:
                # 当前重量可以装入背包
                dp[i][j] = max(dp[i-1][j], dp[i-1][j-weights[i-1]] + values[i-1])
            else:
                # 当前重量超出背包容量,继承上一行的值
                dp[i][j] = dp[i-1][j]

    return dp[n][capacity]

# 物品的重量和价值
weights = [2, 3, 4, 5]
values = [3, 4, 5, 8]
n = len(weights)
capacity = 10

# 调用函数
max_value = knapsack(capacity, weights, values, n)
print("最大价值:", max_value)

该算法时间复杂度:O(VN)

2. 完全背包问题(状态是多维的)

        与0-1背包不同,完全背包问题中的每种物品都有无限多件。因此,对于每种物品,可以选择任意数量放入背包。状态转移方程可以表示为:

但实际计算中,可以优化为:

注意这里与01背包问题的区别:

       : 是包含之前i个(当前也包括)物品的,然而01背包问题是不包含的;

该算法时间复杂度:O(VN)

完全背包问题与0-1背包问题的主要区别在于,完全背包问题中的每种物品都可以无限次地选择。下面我们来看一个完全背包问题的案例及相应的Python代码实现。

案例描述:

假设你有一个背包,它的容量是10公斤。你有三种类型的物品,每种物品可以无限次地选择,它们的重量和价值如下:

  • 物品1:重量2公斤,价值3元
  • 物品2:重量3公斤,价值4元
  • 物品3:重量5公斤,价值8元

你的目标是在不超过背包容量的情况下,使背包中物品的总价值最大化。

def complete_knapsack_forward(capacity, weights, values, n):
    # 初始化二维数组
    dp = [[0 for _ in range(capacity + 1)] for _ in range(n + 1)]

    # 遍历物品
    for i in range(1, n + 1):
        for j in range(1, capacity + 1):
            # 从weights[i-1]开始,正向更新
            if j >= weights[i-1]:
                dp[i][j] = max(dp[i-1][j], dp[i][j - weights[i-1]] + values[i-1])
            else:
                dp[i][j] = dp[i-1][j]

    return dp[n][capacity]

# 物品的重量和价值
weights = [2, 3, 5]
values = [3, 4, 8]
n = len(weights)
capacity = 10

# 调用函数
max_value = complete_knapsack_forward(capacity, weights, values, n)
print("最大价值:", max_value)

3. 多重背包问题

多重背包介于0-1背包和完全背包之间,每种物品有有限个(比如n_i个)。可以采用二进制拆分策略、预处理策略等方法解决。

4. 分数背包问题

分数背包问题中,物品可以分割,即可以选择物品的一部分。这通常可以通过贪心算法解决,根据单位重量价值排序后依次选择。

动态规划解法的核心思想

动态规划解决背包问题的关键在于定义状态和状态转移方程。状态一般定义为𝑓[𝑖][𝑗]f[i][j],表示在前i件物品中选择一些装入容量为j的背包可以获得的最大价值。状态转移方程描述了如何从前一个状态推导出当前状态。

时间复杂度和空间复杂度

  • 对于0-1背包和完全背包问题,基本的时间复杂度和空间复杂度均为O(nW),其中n是物品数量,W是背包容量。
  • 通过滚动数组等技巧,可以将空间复杂度降低至O(W)。

结论

背包问题是动态规划领域的重要案例,通过对不同类型的背包问题的学习,可以深刻理解动态规划的思想和方法。解决背包问题不仅需要数学抽象能力,还需要对算法效率的考虑,特别是在大数据量和高维度问题中。

ref:

https://www.cnblogs.com/laiyaling/p/14497647.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1896403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android的图书交易APP-计算机毕业设计源码25753

摘 要 在数字化与移动互联网迅猛发展的今天&#xff0c;人们对于图书的需求与消费方式也在悄然改变。为了满足广大读者对图书的热爱与追求&#xff0c;我们倾力打造了一款基于Android平台的图书交易APP。这款APP不仅汇聚了海量的图书资源&#xff0c;提供了便捷的交易平台&…

.Net Core + DDD基础分层

基础设施层 基础设施层使用的相关知识&#xff1a;Code First &#xff0c;EF Core&#xff0c;Autofac依赖注入&#xff0c;仓储模式的实现接口&#xff0c;领域服务的实现接口&#xff0c;缓存&#xff0c;以及各种基础工具类 一&#xff0c;Code First&#xff1a;使用Cod…

大学生竞赛管理系统-计算机毕业设计源码37276

大学生竞赛管理系统的设计与实现 摘 要 随着教育信息化的不断发展&#xff0c;大学生竞赛已成为高校教育的重要组成部分。传统的竞赛组织和管理方式存在着诸多问题&#xff0c;如信息不透明、效率低下、管理不便等。为了解决这些问题&#xff0c;提高竞赛组织和管理效率&#x…

新书速览|UML 2.5基础、建模与设计实践

《UML 2.5基础、建模与设计实战》 本书内容 UML是以面向对象图形的方式来描述任何类型的系统&#xff0c;应用领域非常广泛&#xff0c;其中常用的是建立软件系统的模型。《UML 2.5基础、建模与设计实践》基于draw.io开源免费软件&#xff0c;全面讲解UML 2.5的基本概念和建模…

SpringCloud集成Oauth2.0看完这个基本就理解原理了

目录 1.技术栈准备工作 2. 模块架构介绍 3.网关模块&#xff08;gateway&#xff09; 3.1 网关模块(gateway) 3.2 附上主要依赖包 3.3 bootstrap 相关配置 3.4 gateway.yaml 3.5 UserAuthGlobalFiter 全局拦截器配置 4.授权认证模块(auth) 4.1 启用web安全认证&#xff…

移动硬盘传输中断后无法识别:深度解析与数据救援指南

在日常的数据存储与传输过程中&#xff0c;移动硬盘凭借其大容量、便携性成为众多用户的首选。然而&#xff0c;当我们在复制或移动大量数据时遭遇传输中断&#xff0c;随后发现移动硬盘无法被电脑识别&#xff0c;这无疑是一场数据安全的紧急警报。此情此景&#xff0c;不仅影…

RestTemplate、MockMVC、Swagger

rest代码风格 硬编码的部分在实际开发中都是会替换成枚举对象 SpringMVC会自动把json格式的post请求转化为对应接收的 对象 响应请求时&#xff0c;也会自动把 对象转化为 json格式的 RestTemplate 浏览器的地址栏只能提供get请求访问后端&#xff0c;如果要使用post方式发送…

400G SR4和800G SR8光模块在AI集群中的应用

人工智能&#xff08;AI&#xff09;技术的快速发展下&#xff0c;AI集群的计算能力和数据传输需求不断提升。为了满足这一需求&#xff0c;光模块技术也在不断进步。高速率光模块作为新一代高速光通信解决方案&#xff0c;正在逐步应用于AI集群中&#xff0c;为其提供更高效、…

Python函数缺省参数的 “ 坑 ” (与C++对比学习)

我们都知道Python函数的缺省参数可以降低我们调用函数的成本&#xff0c;但是一般我们的缺省参数都是不可变对象&#xff0c;如果是可变对象&#xff0c;我们对其多次调用会发生什么呢&#xff1f; def func(arr[]):arr.append(Hello)print(arr)func() func() func() 这貌似…

phpcms 升级php8.3.8

windows 2008 server 不支持php8.3.8,需升级为windows 2012 1.下载php8.3.8 PHP8.3.9 For Windows: Binaries and sources Releases 2.配置php.ini (1.)在php目录下找到php.ini-development文件&#xff0c;把它复制一份&#xff0c;改名为php.ini (2.)修改php安装目录 根…

盘点2024年六大好用的安全管理软件!

“安全管理”始终是国家和社会关注的焦点&#xff0c;因为安全管理包括了人身安全、企业运营安全、设备稳定以及社会和谐等多个维度。在当前的社会和技术背景下&#xff0c;企业为追求降本增效且能更加高效的管理安全问题&#xff0c;也在不断探索和尝试各种安全管理软件。我凭…

游戏AI的创造思路-技术基础-计算机视觉

让游戏的AI具备“眼睛”和“视觉”&#xff0c;就是通过计算机视觉的方法进行的。现在&#xff0c;越来越多的游戏&#xff0c;特别是动捕类游戏都在使用这个方法。当然&#xff0c;计算机视觉不仅仅用于游戏&#xff0c;越来越多的应用使用到这个技术 目录 1. 定义 2. 发展历…

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(九)-git(1)

Git是一个版本管理控制系统&#xff08;缩写VCS&#xff09;&#xff0c;它可以在任何时间点&#xff0c;将文档的状态作为更新记录保存起来&#xff0c;也可以在任何时间点&#xff0c;将更新记录恢复回来。 文章目录 前言 一、git是什么 二、git基本概念 三、git基本命令 总结…

02-android studio实现下拉列表+单选框+年月日功能

一、下拉列表功能 1.效果图 2.实现过程 1&#xff09;添加组件 <LinearLayoutandroid:layout_width"match_parent"android:layout_height"wrap_content"android:layout_marginLeft"20dp"android:layout_marginRight"20dp"android…

vue配置sql规则

vue配置sql规则 实现效果组件完整代码父组件 前端页面实现动态配置sql条件&#xff0c;将JSON结构给到后端&#xff0c;后端进行sql组装。 这里涉及的分组后端在组装时用括号将这块规则括起来就行&#xff0c;分组的sql连接符&#xff08;并且/或者&#xff09;取组里的第一个。…

细说MCU的ADC模块单通道连续采样的实现方法

目录 一、工程依赖的硬件及背景 二、设计目的 三、建立工程 1、配置GPIO 2、选择时钟源和Debug 3、配置ADC 4、配置系统时钟和ADC时钟 5、配置TIM3 6、配置串口 四、代码修改 1、重定义TIM3中断回调函数 2、启动ADC及重写其回调函数 3、定义用于存储转换结果的数…

30斤用什么快递便宜?大件物品怎么寄划算省钱?

大学生小李最近因为毕业要搬家&#xff0c;不得不把一堆书籍、衣服和一些生活用品寄回家。作为一个精打细算的“穷学生”&#xff0c;小李可是不愿意在快递费上花冤枉钱的。于是&#xff0c;他开始研究各种寄快递省钱的方法&#xff0c;今天我们就来看看小李是怎么操作的。一、…

【Python画图-seaborn驯化】一文学会seaborn画散点图scatterplot、swarmplot技巧

【Python画图-seaborn驯化】一文学会seaborn画散点图scatterplot、swarmplot 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内…

用免费的可视化工具制作3D智慧城市大屏,融合数字孪生,引领数据升级

在如今数据驱动的时代&#xff0c;越来越多的场景中都有可视化大屏的身影&#xff0c;许多企业和政府部门也从常规的二维看板渐渐地转向更加炫酷&#xff0c;立体的3D可视化大屏。3D可视化大屏成为了展示复杂数据、实时监控业务动态的重要工具。本文将详细介绍如何使用免费的数…

基于Springboot的智慧养老中心管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Springboot的智慧养老中心管理系统,…