首页 > 其他分享 >动态规划 背包问题总结

动态规划 背包问题总结

时间:2023-07-08 16:11:07浏览次数:37  
标签:总结 背包 int max dp 动态 写法 Math

 

目录 

  • 01背包 二维写法
  • 01背包 一维写法
  • 完全背包 二维 带枚举写法
  • 完全背包 二维 普通写法
  • 完全背包 一维写法
  • 多重背包 二维写法
  • 多重背包 二进制优化

 

1.  01背包 二维写法

dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - w[i - 1]] + v[i - 1])

 

        // 填写动态规划表
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= C; j++) {
                if (j < w[i - 1]) {
                    // 第i种物品的重量大于当前背包的剩余容量,不能放入
                    dp[i][j] = dp[i - 1][j];
                } else {
                    // 第i种物品的重量小于等于当前背包的剩余容量,可以选择放入或不放入
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - w[i - 1]] + v[i - 1]);
                }
            }
        }

 

 

2.   01背包 一维写法

 dp[j] = Math.max(dp[j], dp[j - w[i - 1]] + v[i - 1])  注:j逆序

 

        // 遍历每一种物品
        for (int i = 1; i <= n; i++) {
            // 遍历每一个单位容量,从后往前更新
            for (int j = C; j >= w[i - 1]; j--) {
                // 更新dp[j]的值
                dp[j] = Math.max(dp[j], dp[j - w[i - 1]] + v[i - 1]);
            }
        }

  

3.   完全背包 二维 带枚举写法

dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - k * v[i - 1]] + k * w[i - 1])

 

        // 状态转移
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= V; j++) {
                dp[i][j] = dp[i - 1][j]; // 不装第i种物品
                for (int k = 0; k * v[i - 1] <= j; k++) { // 枚举装k个第i种物品
                    dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - k * v[i - 1]] + k * w[i - 1]); // 比较不装和装第i种物品的最大价值
                }
            }
        }

  

4.  完全背包 二维 普通写法

 

5.  完全背包 一维写法

 dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - v[i - 1]] + w[i - 1])  注:j 顺序
         // 状态转移
         for (int i = 1; i <= n; i++) {
             for (int j = 1; j <= V; j++) { // 正序遍历容量
                 dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - v[i - 1]] + w[i - 1]); // 比较不装和装第i种物品的最大价值
             }
         }

  

 

6.   多重背包 二维写法

 

dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - k * v[i]] + k * w[i])
        for (int i = 1; i <= N; i++) { // 遍历物品
            for (int j = 0; j <= V; j++) { // 遍历背包容量
                for (int k = 0; k <= s[i] && k * v[i] <= j; k++) { // 遍历物品数量
                    dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - k * v[i]] + k * w[i]); // 状态转移
                }
            }
        }

  

7.  多重背包 二进制优化

 

        for (int i = 1; i <= N; i++) { // 遍历物品
            int k = 1; // 拆分因子
            while (k <= s[i]) { // 拆分数量不超过原数量
                for (int j = V; j >= k * v[i]; j--) { // 遍历背包容量
                    dp[j] = Math.max(dp[j], dp[j - k * v[i]] + k * w[i]); // 状态转移
                }
                s[i] -= k; // 减去已拆分的数量
                k <<= 1; // 拆分因子翻倍
            }
            if (s[i] > 0) { // 如果还有剩余数量
                for (int j = V; j >= s[i] * v[i]; j--) { // 遍历背包容量
                    dp[j] = Math.max(dp[j], dp[j - s[i] * v[i]] + s[i] * w[i]); // 状态转移
                }
            }
        }

  

标签:总结,背包,int,max,dp,动态,写法,Math
From: https://www.cnblogs.com/shoshana-kong/p/17537379.html

相关文章

  • 动态规划之 完全背包
    1.题目有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。这个问题非常类似于01背包问题,所不同的是每种物品有无限件。也就是从每种物品的角度考虑,与它相关......
  • 20230708练习总结
    CF1785DWoodenSpoon为了方便,将题目中的大小关系反转一下。这是一个\(n+1\)层的满二叉树,第\(i\)层每个点都是\(2^{n-i+1}\)个人中的胜者。如果从下往上dp,需要记录胜利者编号和得到木勺者编号,会爆掉。那么从上往下dp。设\(dp_{i,j}\)表示第\(i\)层\(j\)胜利随即......
  • 第一周总结
      这周学习了Hadoop的入门基础部分内容。Hadoop是什么?Hadoop是一个由Apache基金会所开发的分布式系统基础架构。主要解决,海量数据的存储和海量数据的分析计算问题。广义上来说,Hadoop通常是指一个更广泛的概念——Hadoop生态圈。Hadoop的三大发行版本Hadoop三大发行版本:Ap......
  • 一周总结第二次
    这周完成了大部分pta固定题目集的试题,看了许多哔哩哔哩上关于Java的课程,黑马程序员的居多,现在感觉对于Java已经算是入门,也使用Java尝试了许多pta固定题目集上的前面一部分较为简单的试题。对于c++也学到许多在学校没有学习或没有深入了解到的东西,例如堆栈的vector以及队列的queue......
  • git 总结
    gitstash视频链接gitstash:工作区已经修改,但是需要在不提交的情况下切换到其他分支,此时可以使用gitstash来存储当前工作区的修改。gitstashpush//将工作区的修改放入一个栈中,此时工作区就变干净了可以push多个修改到栈中可以简写成gitstashgitstashpop//弹......
  • <折半搜索>题型总结
    折半搜索meetinthemiddle算法(又叫splitandmerge算法)顾名思义这种算法就是同时从两个点往中间搜索,直到碰头为止而使等式两边未知数个数相等或尽量均匀分布是用meetinthemiddle算法解决等式问题的常见方法SP4580ABCDEF题目描述给定一个集合S(元素个数100以内)求......
  • 统计的系统客观性与动态进化性•Freq频率与Bayes两大学派及争论•统计推断•Bayes学派
    统计的系统客观性:统计数据及其活动不是片面的,而是系统客观反映客观现象。周期的做“总体统计”+随机/按需/周期做“抽样统计”;统计的动态进化性:统计数据及其活动不是静止的,持续的更新(量变)与进化(质变)。先验信息的收集挖掘和加工,数量化,形成"先验分布"并持续进化。p......
  • MySQL常用知识点总结
    MySQL常用知识点总结参考地址:(https://maifile.cn/est/a3206887806899/pdf)【一】知识点总结【二】多表查询【三】常用函数【四】Excel数据清洗......
  • 深度剖析之由浅入深揭秘JavaScript类型转换(最全总结篇)
    前言系列首发于公众号『前端进阶圈』,若不想错过更多精彩内容,请“星标”一下,敬请关注公众号最新消息。深度剖析之由浅入深揭秘JavaScript类型转换(最全总结篇)值类型转换将值从一种类型转换为另一种类型通常称为类型转换,分为隐式强制类型转换和显示强制类型转换。两者的区别在于......
  • 每日总结
    7月6日:今天更为深入的学习了大道至简的第四章,让我感觉到了不一样的java,沟通,人与人之间的沟通是必不可少的,我们要合力完成某个项目便需要沟通。开发项目也需要与客户沟通,知道在各个阶段都想干什么,能干什么,而不是一味的埋头。......