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

动态规划----------完全背包问题

1.   动态规划思路

完全背包问题和 0-1 背包问题非常相似,区别仅在于不限制物品的选择次数

  • 在 0-1 背包问题中,每种物品只有一个,因此将物品 i 放入背包后,只i能从前 i−1 个物品中选择。
  • 在完全背包问题中,每种物品的数量是无限的,因此将物品 i 放入背包后,仍可以从前 i 个物品中选择

在完全背包问题的规定下,状态 [i,c] 的变化分为两种情况。

  • 不放入物品 � :与 0-1 背包问题相同,转移至 [i−1,c] 。
  • 放入物品 � :与 0-1 背包问题不同,转移至 [i,c−wgt[i−1]] 。

从而状态转移方程变为:

 dp[i][c] = myMax(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1])

核心代码:

    for (int i = 1; i <= n; i++) {
        for (int c = 1; c <= cap; c++) {
            if (wgt[i - 1] > c) {
                // 若超过背包容量,则不选物品 i
                dp[i][c] = dp[i - 1][c];
            } else {
                // 不选和选物品 i 这两种方案的较大值
                dp[i][c] = myMax(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);
            }
        }
    }
    int res = dp[n][cap];
    // 释放内存

3.   空间优化

由于当前状态是从左边和上边的状态转移而来的,因此空间优化后应该对 dp 表中的每一行进行正序遍历

这个遍历顺序与 0-1 背包正好相反。

  for (int i = 1; i <= n; i++) {
        for (int c = 1; c <= cap; c++) {
            if (wgt[i - 1] > c) {
                // 若超过背包容量,则不选物品 i
                dp[c] = dp[c];
            } else {
                // 不选和选物品 i 这两种方案的较大值
                dp[c] = myMax(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);
            }
        }
    }

相关文章:

  • Android Studio:键值对存储sharedPreferences
  • Qt接入deepseekv3 API 提供openssl 1.1.1g安装包
  • 【matlab】大小键盘对应的Kbname
  • 新产品来袭~适用于新能源电力的霍尔传感器
  • 简述deepseek创始人的创业之路
  • 第三次作业
  • 【详细指南】如何在银河麒麟操作系统上使用DeepSeek?
  • flutter 打包mac应用并安装过程
  • 42.水果销售系统(springbootvue的Java项目[含微信小程序])
  • LabVIEW外腔二极管激光器稳频实验
  • 基于SpringBoot的电影院售票管理系统
  • nextjs的基础了解
  • 【C/C++算法】从浅到深学习--- 二分查找(图文兼备 + 源码详解)
  • 第十一篇:EMC的“电磁护盾”——三电系统干扰抑制实战
  • 【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十四节】
  • 庞氏骗局(Ponzi Scheme):金融投资与公司经营中的隐形陷阱(中英双语)
  • 恒创科技:如何重新启动 Windows 服务器
  • Windows电脑笔记软件多 推荐几款好用的笔记工具
  • Android图片加载框架Coil,Kotlin
  • 企业的文档安全怎么防护?
  • 做哪些网站比较好的/怎么做推广网络
  • 百度建立企业网站建设的目的/网络推广合作资源平台
  • o2o平台有哪些网站/网站优化策划书
  • 有什么正网站做兼职的/windows优化大师要会员
  • 专业做曝光引流网站/seo3的空间构型
  • 临汾网站开发/营销是什么意思