当前位置: 首页 > article >正文

《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(34)混元金斗装万物 - 0-1背包问题(二维DP)

《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(34)混元金斗装万物 - 0-1背包问题(二维DP)

哪吒在数据修仙界中继续他的修炼之旅。这一次,他来到了一片神秘的混元谷,谷中有一座巨大的混元金斗,斗身闪烁着神秘的光芒。谷口有一块巨大的石碑,上面刻着一行文字:“欲破此谷,需以混元金斗之力,装万物,二维DP显真身。”

哪吒定睛一看,石碑上还有一行小字:“物品列表[[2, 3], [3, 4], [4, 5]](重量,价值),背包容量为5,最大价值为7。”哪吒心中一动,他知道这是一道关于0-1背包问题的难题,需要通过二维动态规划的方法,在不超出背包容量的前提下,找到能装入背包的最大价值物品组合。

暴力解法:混元金斗的初次尝试

哪吒心想:“要解决0-1背包问题,我可以尝试所有可能的物品组合。”他催动混元金斗之力,通过递归的方式,枚举所有可能的物品组合,计算每种组合的总价值和总重量,记录最大价值。

int knapsack(vector<vector<int>>& items, int capacity) {
   
    return knapsackHelper(items, capacity, 0);
}

int knapsackHelper(vector<vector<int>>& items, int capacity, int index) {
   
    if (index >= items.size() || capacity <= 0) return 0;
    int value = knapsackHelper(items, capacity, index + 1); // 不选当前物品
    if (capacity >= items[index][0]) {
    // 选当前物品
        value = max(value, items[index][1] + knapsackHelper(items, capacity - items[index][0], index + 1));
    }
    return value;
}

哪吒成功地计算了最大价值,但混元金斗的光芒却黯淡了下来。他意识到,这种方法虽然可行,但时间复杂度极高,尤其是当物品数量很多时,灵力消耗巨大。

C++语法点

在C++中,二维动态规划是解决0-1背包问题的常用方法。以下是一些重要特性:

  • 二维数组

    • 使用vector<vector<int>>表示动态规划表。
    • 常用操作:
      • dp[i][j]:访问第i个物品、容量为j时的最大价值。
      • 初始化二维数组:vector<vector<int>> dp(n + 1, vector<int>(capacity + 1, 0))
  • 动态规划

    • 通过状态转移方程dp[i][j] = max(dp[i-1][j], dp[i-1][j - weight] + value)计算当前状态的最大价值。

高阶优化:二维DP的智慧

哪吒元神中突然浮现金色铭文——「混元金斗装万物,二维DP显真身」。他意识到,可以通过二维动态规划的方法,优化0-1背包问题的解决过程。

哪吒决定使用二维动态规划,创建一个二维数组dp,其中dp[i][j]表示前i个物品在容量为j时的最大价值。通过状态转移方程,他成功地计算了最大价值,而且灵力消耗大幅减少。

int knapsack(vector<vector<int>>& items, int capacity) {
   
    int n = items.size();
    vector<vector<int>> 

http://www.kler.cn/a/587653.html

相关文章:

  • Python 正则表达式模块 re
  • uniapp scroll组件下拉刷新异步更新数据列表
  • 基于SSM + JSP 的图书商城系统
  • 云原生服务网格:微服务通信的智能基础设施
  • Android安全支付-整体架构-KeyStore2-APP到Framework层的调用
  • Spring Cloud 与 Spring Cloud Alibaba 微服务开发流程详解:解耦之道
  • Qt6编译安装linguist语言家
  • JavaScript性能优化指南:聚焦DOM操作优化
  • Flink术语
  • 深度学习在医疗影像诊断中的应用与实现
  • 论文笔记 - ULTRA-SPARSE MEMORY NETWORK
  • python速通小笔记-------1.容器
  • 严格把控K8S集群中的操作权限,为普通用户生成特定的kubeconfig文件
  • 打包当前Ubuntu镜像 制作Ubuntu togo系统
  • 从零开始学机器学习——分类器详解
  • 基于UniApp + Vue3开发的智能汉字转拼音工具
  • 查找sql中涉及的表名称
  • MambaTab:表格数据处理的新利器
  • 基于Asp.net的汽车租赁管理系统
  • 机器学习中的激活函数是什么起什么作用