介绍一下背包DP(C++)

背包DP简介

背包DP是一类经典的动态规划问题,核心思想是通过状态转移方程求解最优解。典型问题包括01背包、完全背包、多重背包等,用于解决有限容量下的物品选择问题。

01背包问题

问题描述:给定容量为W的背包和N个物品,每个物品有重量w[i]和价值v[i]。每个物品只能选或不选,求最大价值。

状态定义
  • dp[i][j]表示前i个物品在容量j下的最大价值。
状态转移方程
cpp 复制代码
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]);
空间优化

使用一维数组逆序更新:

cpp 复制代码
for (int i = 1; i <= N; ++i) {
    for (int j = W; j >= w[i]; --j) {
        dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
    }
}

完全背包问题

问题描述:与01背包类似,但每个物品可以选无限次。

状态转移方程
cpp 复制代码
dp[i][j] = max(dp[i-1][j], dp[i][j-w[i]] + v[i]);
空间优化

正序更新一维数组:

cpp 复制代码
for (int i = 1; i <= N; ++i) {
    for (int j = w[i]; j <= W; ++j) {
        dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
    }
}

多重背包问题

问题描述:每个物品有数量限制s[i],可转化为01背包或使用二进制优化。

二进制优化

s[i]拆分为1, 2, 4, ..., 2^k的组合:

cpp 复制代码
for (int i = 1; i <= N; ++i) {
    int cnt = s[i];
    for (int k = 1; k <= cnt; k *= 2) {
        cnt -= k;
        for (int j = W; j >= k * w[i]; --j) {
            dp[j] = max(dp[j], dp[j - k * w[i]] + k * v[i]);
        }
    }
    if (cnt > 0) {
        for (int j = W; j >= cnt * w[i]; --j) {
            dp[j] = max(dp[j], dp[j - cnt * w[i]] + cnt * v[i]);
        }
    }
}

代码示例(01背包完整实现)

cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int N = 5, W = 10;
    vector<int> w = {0, 2, 3, 4, 5, 6}; // 重量(0占位)
    vector<int> v = {0, 3, 4, 5, 6, 7}; // 价值(0占位)
    vector<int> dp(W + 1, 0);

    for (int i = 1; i <= N; ++i) {
        for (int j = W; j >= w[i]; --j) {
            dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
        }
    }
    cout << "Max value: " << dp[W] << endl;
    return 0;
}

关键点总结

  • 01背包:逆序更新,避免重复选择。
  • 完全背包:正序更新,允许重复选择。
  • 多重背包:二进制优化降低时间复杂度。
  • 初始化 :根据问题需求设置dp[0] = 0或其他初始值。
相关推荐
Helen_cai1 小时前
OpenHarmony 完整项目工程整合规范 + 模块化分层架构(API23+ 标准企业级结构)
开发语言·华为·php·harmonyos
大圣编程6 小时前
Java 多维数组详解
java·开发语言
殳翰8 小时前
下服务器端开发流程及相关工具介绍(C++)
开发语言·c++
落寞的星星9 小时前
这个对象就包含了已经转换好的DFA和各种词法分析器运转所需要的参数。下一步,我们就可以用ScannerInfo对象创建出Scanner对象,请看下面的代码:
开发语言·c#
nothing&nowhere9 小时前
用 Python 做问卷数据清洗:无效样本检测与处理实战
开发语言·python·数据清洗·数据处理·问卷星·问卷星脚本·刷问卷
青瓦梦滋9 小时前
协议定制/序列化-反序列化(Linux视角)
linux·服务器·网络·c++
2601_9615934210 小时前
Rust 开发环境配置繁琐?RustRover 开箱即用搞定编码调试
开发语言·后端·macos·rust
HZZD_HZZD10 小时前
DL/T 645-2026新国标深度解读与智能电表协议适配实战:从帧结构变化到Java采集器升级的全链路改造方案
java·开发语言
多加点辣也没关系12 小时前
JavaScript|第4章:类型转换
开发语言·javascript
聪慧的水蜜桃12 小时前
【YFIOs】用C#开发硬件之设备上云
开发语言·c#