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

一、问题阐述

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

二、代码

cpp 复制代码
#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]

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

相关推荐
lxmyzzs16 分钟前
【图像算法 - 16】庖丁解牛:基于YOLO12与OpenCV的车辆部件级实例分割实战(附完整代码)
人工智能·深度学习·opencv·算法·yolo·计算机视觉·实例分割
wow_DG1 小时前
【C++✨】多种 C++ 解法固定宽度右对齐输出(每个数占 8 列)
开发语言·c++·算法
Epiphany.5561 小时前
c++最长上升子序列长度
c++·算法·图论
Cx330❀2 小时前
【数据结构初阶】--排序(四):归并排序
c语言·开发语言·数据结构·算法·排序算法
余_弦2 小时前
区块链中的密码学 —— 密钥派生算法
算法·区块链
亲爱的非洲野猪2 小时前
令牌桶(Token Bucket)和漏桶(Leaky Bucket)细节对比
网络·算法·限流·服务
NAGNIP3 小时前
一文读懂LLAMA
算法
烧冻鸡翅QAQ3 小时前
62.不同路径
算法·动态规划
番薯大佬3 小时前
编程算法实例-冒泡排序
数据结构·算法·排序算法
queenlll3 小时前
P2404 自然数的拆分问题(典型的dfs)
算法·深度优先