算法设计-0-1背包动态规划(C++)

server/2025/2/4 18:20:19/

一、问题阐述

0-1 背包问题的目标是在给定背包容量 W 的情况下,从 n 个物品中选择一些物品放入背包,使得背包中物品的总价值最大。每个物品只能选择一次(即要么放入背包,要么不放入)。

二、代码

#include <iostream>
#include <vector>
using namespace std;// 动态规划解决 0-1 背包问题
int knapsack(int W, const vector<int>& weights, const vector<int>& values, int n) {// 创建二维 DP 表vector<vector<int>> dp(n + 1, vector<int>(W + 1, 0));// 填充 DP 表for (int i = 1; i <= n; ++i) {for (int w = 0; w <= W; ++w) {if (weights[i - 1] <= w) {// 选择第 i 个物品dp[i][w] = max(dp[i - 1][w], dp[i - 1][w - weights[i - 1]] + values[i - 1]);} else {// 不选择第 i 个物品dp[i][w] = dp[i - 1][w];}}}// 返回最大价值return dp[n][W];
}int main() {// 输入int n, W;cout << "请输入物品数量 n 和背包的最大承重 W: ";cin >> n >> W;vector<int> weights(n);vector<int> values(n);cout << "请输入每个物品的重量: ";for (int i = 0; i < n; ++i) {cin >> weights[i];}cout << "请输入每个物品的价值: ";for (int i = 0; i < n; ++i) {cin >> values[i];}// 计算最大价值int max_value = knapsack(W, weights, values, n);// 输出结果cout << "最大总价值为: " << max_value << endl;return 0;
}

三、复杂度

  • 时间复杂度:O(n * W),其中 n 是物品数量,W 是背包容量。

  • 空间复杂度:O(n * W),用于存储 DP 表。

四、详细阐述

代码结构

  1. 输入部分:从用户那里获取物品数量 n、背包容量 W,以及每个物品的重量和价值。

  2. 动态规划求解:使用二维 DP 表来存储子问题的解,逐步填充表格,最终得到最大价值。

  3. 输出部分:输出背包能容纳的最大价值。

动态规划表 dp
  • dp[i][w] 表示前 i 个物品在背包容量为 w 时的最大价值。

  • dp 表的大小为 (n + 1) x (W + 1),初始化为 0。

状态转移方程
  • 对于第 i 个物品,有两种选择:

    1. 不选择第 i 个物品:最大价值为 dp[i - 1][w]

    2. 选择第 i 个物品:最大价值为 dp[i - 1][w - weights[i - 1]] + values[i - 1]

  • 最终选择两者中的最大值


http://www.ppmy.cn/server/164945.html

相关文章

【C++】string类(上):string类的常用接口介绍

文章目录 前言一、C中设计string类的意义二、string类的常用接口说明1. string类对象的常见构造2. string类对象的容量操作2.1 size、capacity 和 empty的使用2.2 clear的使用2.3 reserve的使用2.4 resize的使用 3. string类对象的访问及遍历操作3.1 下标[ ] 和 at3.2 迭代器it…

【C++】B2120 单词的长度

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;我的做法代码实现&#xff1a;思路解析&#xff1a; &#x1f4af;老师的第一种做法代码实现&#xff1a;思路解析&#xff1a; &#x1f4af;老师的…

记录 | 基于MaxKB的仿小红书旅游文章AI制作(含图文、视频)

目录 前言一、创建应用Step1 表单Step2 AI对话生成旅游攻略提炼场景Step3 图片生成Step4 视频生成Step5 指定回复二、检验效果三、整体结构视图更新时间前言 参考文章: 自己的感想 想复现文章的内容你需要先学习下我之前的三篇文章中的记录。 1、记录 | Docker的windows版安装…

css三角图标

案例三角&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><s…

基于SpringBoot电脑组装系统平台系统功能实现五

一、前言介绍&#xff1a; 1.1 项目摘要 随着科技的进步&#xff0c;计算机硬件技术日新月异&#xff0c;包括处理器&#xff08;CPU&#xff09;、主板、内存、显卡等关键部件的性能不断提升&#xff0c;为电脑组装提供了更多的选择和可能性。不同的硬件组合可以构建出不同类…

05-机器学习-数据标注

一、学习数据标注的核心目标 数据标注不仅是“打标签”&#xff0c;而是理解数据与AI模型之间的桥梁。需要掌握&#xff1a; 标注技术&#xff1a;不同任务类型的标注方法&#xff08;如分割、实体识别&#xff09;。标注工具&#xff1a;高效使用专业工具&#xff08;如CVAT…

DeepSeek本地部署详细指南

DeepSeek本地部署详细指南 随着人工智能技术的飞速发展&#xff0c;本地部署大模型的需求也日益增加。DeepSeek作为一款开源且性能强大的大语言模型&#xff0c;提供了灵活的本地部署方案&#xff0c;让用户能够在本地环境中高效运行模型&#xff0c;同时保护数据隐私。以下是…

NetLify账号无法登录解决办法

本文收录在【建站】专栏内&#xff0c;专栏目录&#xff1a;【建站】专栏目录 用github账号登录时&#xff0c;说校验失败 Authentication Error Authenticating failed due to the following error: Your account requires additional verification. Please check your email…