news 2026/4/23 8:26:34

部分背包与01背包问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
部分背包与01背包问题

阅读目录(Content)

一、部分背包问题

二、01背包问题:动态规划的入门

在算法的学习中,背包问题是一类经典的课题,其中,部分背包问题和01背包问题是两种最基础的形式。

如果你想深入探索背包问题,强烈推荐搜索“背包九讲”。

一、部分背包问题

问题描述:假设我们有 n 件物品和一个容量为 V 的背包。每件物品 i 有其价值 v[i] 和重量 w[i]。

在部分背包问题中,我们可以选择物品的一部分放入背包(例如,金砂可以按克取;即:单样物品可以重复拿)。

我们的目标是,如何选择物品,使得装入背包的物品总价值最大?

核心思想:贪心算法。因为这个问题不存在所谓的局部最优/全局最优,只要有限拿最有价值的即可,算是

贪心算法的Hello World。

贪心策略步骤:

计算所有物品的单位价值:v[i] / w[i]

将物品按单位价值从高到低排序。

初始化当前背包剩余容量 left = V 和总价值 total_value = 0。

遍历排序后的物品列表:

如果当前物品的重量 w[i] <= left,说明背包还能装下整个物品,那么就把它全部装入。total_value += v[i],同时 left -= w[i]。

否则,只能装入物品的一部分。装入 left 重量的该物品,total_value += (v[i] / w[i]) * left,然后背包已满,循环结束。

伪代码实现:

复制代码

function fractional_knapsack(v, w, V):

n = length(v)

items = [] // 创建一个列表,存储物品索引、价值和重量

for i from 0 to n-1:

ratio = v[i] / w[i]

items.append((ratio, v[i], w[i], i)) // 将单位价值、价值、重量、索引打包

sort items in descending order by ratio // 按单位价值降序排序

total_value = 0

left_capacity = V

for each item in items:

if left_capacity >= item.w:

// 可以拿全部

total_value += item.v

left_capacity -= item.w

else:

// 只能拿一部分

total_value += item.ratio * left_capacity

break // 背包已满,退出循环

return total_value

复制代码

二、01背包问题:动态规划的入门

问题描述:场景与部分背包类似,但关键的区别在于,对于每件物品,我们要么完整地放入背包(选择1),要么完全不放入(选择0),不能只取一部分。这就是“01”的由来。

(即每样物品不能重复放入)

这个问题无法再用简单的贪心算法解决。这个问题主要演示动态规划的使用。

什么是动态规划?

动态规划是一种通过把复杂问题分解为相对简单的子问题,并存储子问题的解来避免重复计算,从而高效解决问题的方法。

(即缓存之前步骤的结果,重复使用)

我们只要定义好状态转移逻辑,即类似:dp[current]=dp[current-1]+dp[current-2] 这样的规则,

然后在代码里应用规则即可。

可以想象为一张二维表,每步每个选择的结果都出现在表中

如需更详尽了解可网络上搜索一些教程。

注意:

01背包问题使用动态规划解决,因需要确保动态规划代码的简洁,0下标元素留空,步骤1从1下标的元素开始。

伪代码实现:

复制代码

function zero_one_knapsack(v, w, V):

n = length(v)

// 初始化一个 (n+1) x (V+1) 的二维数组dp,所有元素初始为0

dp = array[0..n][0..V] of 0

for i from 1 to n: // i 从1开始,对应第i件物品(索引为i-1)

for j from 0 to V: // j 是当前背包容量

if j < w[i-1]:

// 当前背包容量j小于物品i的重量,装不下

dp[i][j] = dp[i-1][j]

else:

// 装得下,在“不装”和“装”之间选择价值更大的方案

dp[i][j] = max(dp[i-1][j], dp[i-1][j - w[i-1]] + v[i-1])

return dp[n][V] // 考虑前n件物品,容量为V时的最大价值

复制代码

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 17:04:31

测试工程师的会议演讲艺术:从技术思维到有效表达

为什么测试会议需要特别的演讲技巧 在敏捷开发与DevOps普及的当下&#xff0c;测试工程师参与会议的频率显著增加。然而&#xff0c;技术专家常陷入“数据堆砌却重点模糊”的困境——缺陷统计面面俱到却未能突出风险本质&#xff0c;测试报告事无巨细却忽略决策支持。优秀的测…

作者头像 李华
网站建设 2026/4/18 19:30:12

Windows找不到XAPOFX1_5.dll文件 如何下载修复?

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/4/14 7:47:20

Windows找不到XAudio2_6.dll文件 如何下载修复?

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/4/22 14:51:07

C++学习之旅【C++内存管理、模板初阶以及STL简介】

&#x1f525;承渊政道&#xff1a;个人主页 ❄️个人专栏: 《C语言基础语法知识》 《数据结构与算法初阶》《C初阶知识内容》 ✨逆境不吐心中苦,顺境不忘来时路! &#x1f3ac; 博主简介: 引言:前篇文章,小编已经全面实战解析了C类和对象的相关知识,那我暂且就将这部分学习告…

作者头像 李华
网站建设 2026/4/20 4:56:58

Docker MCP网关502/504频发?专家级错误追踪与快速定位全流程曝光

第一章&#xff1a;Docker MCP网关错误处理概述在使用 Docker 部署微服务架构时&#xff0c;MCP&#xff08;Microservice Communication Proxy&#xff09;网关作为服务间通信的核心组件&#xff0c;其稳定性直接影响系统的可用性。当网关出现错误时&#xff0c;常见的问题包括…

作者头像 李华