01背包问题个人剖析

news/2024/12/2 20:39:10/

背包问题

文章目录

  • 背包问题
    • 1 01背包问题
      • 1.1 问题阐述
      • 1.2 问题分析
    • 背包问题中我最初的一些疑惑

1 01背包问题

我参考了文献背包九讲。https://github.com/tianyicui/pack/raw/master/V2.pdf 背包九讲的作者是ACM大牛崔天翼。

1.1 问题阐述

N N N件物品和一个容量为 V V V的背包,放入第 i i i件物品所需的容量 C i C_i Ci, 得到的价值是 W i W_i Wi。求解将哪些物品放入背包可以使得价值总和最大。

1.2 问题分析

“最大”关键词表明本题是一个最优化问题。在本题中,我们通过做出一组选择”对于每一件物品是否放入背包“,来达到最优解。为了便于阐述,我们可以给每一种物品进行编号,1,2,3,…,N. 对于物品 i i i,我们有两种选择,放或者不放。

在一个最优方案中,物品 i i i被放入背包还是没有被放入背包,都有可能。因为最优方案可能不止一个,同时要注意到的是:最优值只有一个。

F [ i , v ] F[i,v] F[i,v]为编号为1,2,3, … \dots , i的物品放入容量为 v v v的背包所能够获得的最大价值。

(1)假设在一个最优方案中,我们将物品N放入了背包,则问题就转化为”编号为1,2,…,N-1的物品放入剩下容量为 V − C N V-C_N VCN的背包中“,此时能够获得的最大价值就是 F [ N − 1 , V − C N ] F[N-1,V-C_N] F[N1,VCN]再加上放入物品 N N N获得的最大价值 W i W_i Wi,即 F [ N , V ] = F [ N − 1 , V − C i ] + W i F[N,V] = F[N-1,V-C_i] + W_i F[N,V]=F[N1,VCi]+Wi. ”编号为1,2,…,N-1的物品放入剩下容量为 V − C N V-C_N VCN的背包中“这个子问题只和物品 1 , 2 , … , N − 1 1,2,\dots, N-1 1,2,,N1相关,是一个独立的子问题。

(2) 假设在一个最优方案中,物品N没有被放入背包,那么问题就转化为”物品 1 , 2 , 3 , … , N − 1 1,2,3,\dots, N-1 1,2,3,,N1放入容量为 V V V的背包中“。 价值为 F [ N − 1 , V ] F[N-1,V] F[N1,V].

然而我们并不知道是放入 D D D还是不放入 D D D能够取得最优值。有可能放入 D D D能够取得最优值,也有可能不放入 D D D能够取得最优值,还有可能放入 D D D或者不放入 D D D都可以取得最优值。例如,物品种数为4, 4中物品的容量均为3, 价值均为5,背包的容量为9,则任选3个物品即为一个最优解。

我们知道的是: F [ N , V ] = max ⁡ ( F [ N − 1 , V − C N ] + W N , F [ N − 1 , V ) F[N, V] = \max (F[N-1,V-C_N]+W_N , F[N-1,V) F[N,V]=max(F[N1,VCN]+WN,F[N1,V)

同时我个人对背包问题有一些理解。即背包问题的子问题几乎很少是重叠的子问题,使用自顶向下算法似乎更加高效。然而现有的算法大部分均是自底向上的。附上我自己推演的自顶向下的例子。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IX1SsuG7-1682996640892)(背包问题详解/image-20230502110102554.png)]

背包问题中我最初的一些疑惑

1 我们设F[i,j]考虑前i件物品,容量限制为j时背包所能装的最大价值。则递推公式需要考虑两种情况:

要么不放入第i件物品,则F[i,j] = F[i-1,j] 。

要么放入第i件物品,则F[i,j] = F[i-1, j- C i C_i Ci]

我们需要取这两者的最大值才是最终的F[i,j]。

即F[i,j] = max(F[i-1, j], F[i-1, j- C i C_i Ci]).

我的疑惑是:第i件物品后于第i-1件物品被考虑,是否会出现由于先装入了部分前i-1件物品所导致第i件非常有价值的物品无法被装入的情况?

答:之所以将N件物品进行一个先后的排序,主要是为了记录不同物品的重量和价值。然而,每当我们考虑一件新的物品时,该物品可以放,也可以不放。我们得到的最大价值是两种选择的最大值。所以不会出现返回的是非最优解。


http://www.ppmy.cn/news/58313.html

相关文章

小红书违禁词有哪些,小红书违禁词汇总分享

大家都知道小红书平台对于违禁词的管控一向非常严格,笔记中一旦出现就可能被限流,今天为大家整理了一份小红书违禁词汇总,希望能够帮助大家避免被限流。 小红书违禁词汇总大致有以下几个分类,大家平时写笔记的时候最好避开这些词或…

辅助驾驶功能开发-功能规范篇(16)-2-领航辅助系统NAP-功能ODD定义

1.系统定义 智能驾驶系统包含行车场景功能和泊车场景功能,行车场景功能包括安全ADAS功能、基础ADAS功能和高阶ADAS功能三大类,本文档定义高阶ADAS功能中的导航辅助驾驶功能用例。 1.1.高阶ADAS功能列表 功能需求ID 功能分类 功能名称

网络安全入门基础知识

计算机网络 计算机网络是利用通信线路将不同地理位置、具有独立功能的计算机和通信设备连接起来,实现资环共享和信息传递等目的的计算机系统。 主要有局域网,城域网,广域网,和互联网等 信息系统 信息系统是能进行信息采集、传…

Qt常用快捷键

Qt常用快捷键 1.添加头文件:Alt Enter2.查看槽函数的实现 位置:F2 / F43.快速查看帮助文档:F14.代码快速对齐:Ctrl I5.代码全选:Ctrl A6.保存:Ctrl S7.代码复制:Ctrl C8.代码粘贴&#xff…

动态规划——最大子数组和

问题描述&#xff1a; 最大子数组和Time Limit: 1000 MSMemory Limit: 5000 KB Description 给定一个长度为N的int型数组a[0,1,2,...N-1], 请计算最大子数组和.Input 第一行输入M表示包含M组测试数据&#xff0c;每组先输入N (N<50000), 接着输入N个int型整数.Output 输…

CentOS+nginx手动搭建WordPress

文章目录 前提条件php安装安装 EPEL 源及源管理工具&#xff1a;安装 REMI 源&#xff1a;安装 PHP7.3 及扩展&#xff1a;设置开机自动启动其他php命令 wordpress 安装下载WordPress将下载的WordPress移动至网站根目录修改WordPress配置文件配置nginx 创建完成后根据域名访问 …

C++的智能指针

文章目录 1. 内存泄漏1.1 什么是内存泄漏1.2 内存泄漏分类 2. 为什么需要智能指针3. 智能指针的使用及原理3.1 RAII3.2 使用RAII思想设计的SmartPtr类3.3 让SmartPtr像指针一样3.3 SmartPtr的拷贝3.4 auto_ptr3.5 unique_ptr3.6 shared_ptr3.6.1 shared_ptr的循环引用3.6.2 wea…

Django入门ORM(Django操作MySQL) 专题一

Django入门ORM 原始数据库操作方式&#xff08;原生SQL&#xff09; 最早我们如果不用ORM的话&#xff0c;我们可以用MYSQL Pymysql的方式进行数据库的操作。 操作方法如下。 import pymysqldb pymysql.connect(host"", user"", password""…