news 2026/6/21 5:51:07

[特殊字符] 背包问题详解(0/1 背包、完全背包、多重背包)——附 C++ 实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[特殊字符] 背包问题详解(0/1 背包、完全背包、多重背包)——附 C++ 实现

🧳 背包问题详解(0/1 背包、完全背包、多重背包)——附 C++ 实现

一、什么是背包问题?

背包问题(Knapsack Problem)是经典的动态规划问题之一:

给定一个容量有限的背包和若干物品,每个物品有体积(或重量)*和*价值,问如何选择物品使得总价值最大**。

根据每个物品可选次数不同,背包问题主要分为:

  • 0/1 背包(每个物品最多选一次)
  • 完全背包(每个物品可以选无限次)
  • 多重背包(每个物品有固定数量)

二、0/1 背包问题

1️⃣ 问题描述

  • 背包容量:W
  • 物品数量:n
  • i个物品:
    • 重量:w[i]
    • 价值:v[i]
  • 每个物品最多选一次

目标:
👉 在不超过背包容量的前提下,使总价值最大。


2️⃣ 状态定义

令:

dp[j] = 容量为 j 时能获得的最大价值

3️⃣ 状态转移方程

对于第i个物品:

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

⚠️关键点
j必须从大到小遍历,防止一个物品被选多次。


4️⃣ C++ 实现(0/1 背包)

#include<bits/stdc++.h>usingnamespacestd;intmain(){intn,W;cin>>n>>W;vector<int>w(n),v(n);for(inti=0;i<n;i++){cin>>w[i]>>v[i];}vector<int>dp(W+1,0);for(inti=0;i<n;i++){for(intj=W;j>=w[i];j--){dp[j]=max(dp[j],dp[j-w[i]]+v[i]);}}cout<<dp[W]<<endl;return0;}

三、完全背包问题

1️⃣ 问题描述

与 0/1 背包类似,但:

每个物品可以选无限次


2️⃣ 状态转移区别

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

⚠️关键区别
j必须从小到大遍历,允许多次使用当前物品。


3️⃣ C++ 实现(完全背包)

#include<bits/stdc++.h>usingnamespacestd;intmain(){intn,W;cin>>n>>W;vector<int>w(n),v(n);for(inti=0;i<n;i++){cin>>w[i]>>v[i];}vector<int>dp(W+1,0);for(inti=0;i<n;i++){for(intj=w[i];j<=W;j++){dp[j]=max(dp[j],dp[j-w[i]]+v[i]);}}cout<<dp[W]<<endl;return0;}

四、多重背包问题

1️⃣ 问题描述

  • 每个物品最多只能选k[i]

2️⃣ 常见解决方法

✅ 方法一:暴力枚举(不推荐)

三重循环,时间复杂度高。

✅ 方法二:二进制拆分(推荐)

k个物品拆成:

1, 2, 4, ..., 剩余

然后转化为0/1 背包问题


3️⃣ C++ 实现(二进制优化)

#include<bits/stdc++.h>usingnamespacestd;intmain(){intn,W;cin>>n>>W;vector<int>dp(W+1,0);for(inti=0;i<n;i++){intw,v,k;cin>>w>>v>>k;for(intc=1;k>0;c<<=1){intnum=min(c,k);k-=num;intweight=num*w;intvalue=num*v;for(intj=W;j>=weight;j--){dp[j]=max(dp[j],dp[j-weight]+value);}}}cout<<dp[W]<<endl;return0;}

五、三种背包对比总结

类型每件物品j 遍历方向本质
0/1 背包最多 1 次从大到小防止重复选
完全背包无限次从小到大允许重复
多重背包有上限转化为 0/1二进制优化

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

含分布式电源配电网潮流计算及相关实践

含分布式电源配电网潮流计算&#xff0c;IEEE33节点系统进行仿真。 牛顿拉夫逊法&#xff0c;前推回代法算例程序。 加入无功补偿装置&#xff0c;并可改变分布式电源的接入位置。在电力系统领域&#xff0c;含分布式电源&#xff08;DG&#xff09;的配电网潮流计算是一个关键…

作者头像 李华
网站建设 2026/6/21 5:29:24

2025年数字化转型:AI技能+CAIE认证夯实进阶根基

2025 年&#xff0c;各行业数字化转型已进入深水区&#xff0c;从传统制造业的智能产线到服务业的数字中台&#xff0c;人工智能技能成为驱动数字化落地的核心引擎&#xff0c;而权威的 AI 认证则是从业者打通数字化岗位通道的关键凭证。 一、核心驱动&#xff1a;人工智能技能…

作者头像 李华
网站建设 2026/6/20 16:12:53

9、如何为你选择合适的 UNIX Shell:全面比较与分析

如何为你选择合适的 UNIX Shell:全面比较与分析 在 UNIX 系统中,选择合适的 shell 至关重要。当代大多数 UNIX 版本提供了三种标准 shell,包括 Bourne 和/或 POSIX shell、C shell 以及 Korn shell,此外还有 Z shell、TC shell、RC shell 和 Bourne Again shell 等。选择正…

作者头像 李华
网站建设 2026/6/19 13:13:12

12、UNIX 系统启动与关机全解析

UNIX 系统启动与关机全解析 1. 引言 在 UNIX 系统管理中,启动和关机操作与大多数任务有所不同。管理员在决定启动或关机的时间后,更多时候是一个被动的观察者,而非积极的参与者。在这个过程中,需要保持警惕并具备充分的理解,而非仅仅预测问题和需求。启动过程会向系统控…

作者头像 李华
网站建设 2026/6/19 12:49:49

React 新手村通关指南:状态、组件与魔法 UI

React 入门&#xff1a;从 JSX 到组件化&#xff0c;搞定核心知识点 &#x1f680; 一、 什么是 React & 为什么选择 React&#xff1f;&#x1f3af; 如果你问前端圈的程序猿 “现在最火的 UI 库是什么”&#xff0c;十有八九会听到 “React” 这个名字。简单来说&#xf…

作者头像 李华
网站建设 2026/6/21 4:11:37

vue基于Spring Boot框架旅游报团预订平台的设计与实现 _25ewgh2u

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华