01背包思路解析+代码

这篇具有很好参考价值的文章主要介绍了01背包思路解析+代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

01背包

题目链接:01背包

01背包思路解析+代码

01背包思路解析+代码

思路:题目要求是获取背包能装的最大重量。一个物品有体积和重量两个属性。而当我们判断一个物品是否要放进背包,第一取决于他的体积是否足以放进背包,第二取决于他的重量是否足以让我们取出已经放入的一部分物品,再放入该物品。所以我们要保存放入该物品之前的状态,于是我们想到可以使用动态规划。


因为物品有两个属性,我们可以使用二维数组F(i,j)记录。
状态:F(i,j):前i个物品放入大小为j的背包中获得的最大重量(将体积为V的背包分治成1~V大小的背包
状态转移方程:
对于第i个物品,和1~V的体积的背包,有两种情况:

  1. 当前j体积的背包不足以放入第i个物品,那么F(i,j)=F(i-1,j),即不放入
  2. 当前j体积的背包可以放入第i个物品,那么此时有两个选择,放与不放

:需要腾出足够的空间放入,F(i,j)=F(i-1,j - vw[i][0])+vw[i][1]
PS:j - vw[i][0]代表腾出足够空间,+vw[i][1]代表放入该物品,要加上重量

不放:F(i,j)=F(i-1,j)

最后取两个选择中,重量较大的那个
F(i,j)=max(F(i-1,j - vw[i][0]) + vw[i][1],F(i-1,j) )

图片来自牛客题解:摸鱼学大师

第0行和第0列初始化为1

01背包思路解析+代码

代码如下:

int knapsack(int V, int n, vector<vector<int> >& vw)
{
    vector<vector<int>> dp(n+1,vector<int>(V+1,0));
    //i和j都从1开始访问,并且要访问到最后一个商品和背包的最大容量
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=V;++j)
        {
            //容量足够
            //i=1代表第一个商品,但对于vw的第0行
            if(vw[i-1][0]<=j)
               dp[i][j]=max(dp[i-1][j],dp[i-1][j-vw[i-1][0]]+vw[i-1][1]);
            else
               dp[i][j]=dp[i-1][j];
        }
    }

    return dp[n][V];
}

在实际运行过程中,我们发现,二维数组其实每次只会用到当前行的上一行,所以我们可以用一维数组代替。
但是在递推时,更新应该从右往左,才不会提前覆盖上一行的数据文章来源地址https://www.toymoban.com/news/detail-502062.html

int knapsack(int V, int n, vector<vector<int> >& vw) {
        //一维数组
        //因为每次更新只需要用到上一行
        //所以我们可以使用一维数组记录上一行,然后从右往左更新
        vector<int> dp(V+1,0);

        for(int i=1;i<=n;++i)
        {
            for(int j=V;j>0;--j)
            {
                if(vw[i-1][0]<=j)
                    dp[j]=max(dp[j],dp[j-vw[i-1][0]]+vw[i-1][1]);
            }
        }

        return dp[V];
    }

到了这里,关于01背包思路解析+代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 背包问题分析代码详解【01背包+完全背包+多重背包】

    一、01背包问题 问题描述: 有 N 件物品和一个容量为 V 的背包,每件物品有各自的价值且只能被选择一次,要求在有限的背包容量下,装入的物品总价值最大。 朴素01背包 状态f[i , j]定义:在前i个物品中选,总体积不超过j的价值最大值 状态转移 1) 选第i个物品:f[i,j] = f

    2024年02月06日
    浏览(26)
  • 01背包问题----动态规划 -----python代码、优化

    问题描述: 容量为C的背包选择装物品,有n个物品,它们有各自的体积wi和价值vi,如何让背包里装入的物品具有最大价值? 解题思路: 也就是n个物品选择装入背包,每个物品都有两种选择,是(1)或否(0), 建模:       xi表示当前第i个物品是否选择,xi取值为(0,1)

    2024年02月04日
    浏览(42)
  • 7-1 矩阵链相乘问题 (20 分)(思路+详解+题目解析) 动态规划做法

    2:关于本题的矩阵乘法和递推方程的得出 3:实例演示 三:思路 =================================================================== 思路:这里在考虑的的时候,因为是多个矩阵相乘,求的最小乘法次数, 比如 A1_A2_A3_A4, 那么根据划分的不同,那么其乘法顺序也会不同,继而所求的乘法次数

    2024年04月09日
    浏览(57)
  • 动态规划01背包问题-代码随想录-刷题笔记

    有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。 每件物品只能用一次 ,求解将哪些物品装入背包里物品价值总和最大。 二维dp数组01背包 确定dp数组以及下标的含义 是使用二维数组,即 dp[i][j] 表示从下标为[0-i]的物品里任意取,

    2024年02月07日
    浏览(35)
  • 回溯法解01背包问题(最通俗易懂,附C++代码)

    01背包问题是算法中的经典问题,问题描述如下: 对于给定的N个物品,第i个物品的重量为Wi,价值为Vi,对于一个最多能装重量C的背包,应该如何选择放入包中的物品,使得包中物品的总价值最大? 回溯法的本质其实就是一种蛮力法,只是通过一定的方法可以使得蛮力法中

    2023年04月08日
    浏览(27)
  • Leetcode各种题型题目+思路+代码(共176道题及答案)

    文章目录 第一章:Leetcode 每日很多题 1、Leetcode-1047 删除字符串中的所有相邻重复项 2、剑指 Offer 53 - I. 在排序数组中查找数字 I 3、Leetcode704:二分查找 4、 Leetcode 227:基本计算器II 5、leetcode 224:基本计算器(带括号的计算) 6、Leetcode 15:三数之和:排序+双指针 7、剑指 offer 38

    2024年02月07日
    浏览(23)
  • 代码随想录 Day35 动态规划04 01背包问题和完全背包问题 LeetCode T416 分割等和子集

    说到背包问题大家都会想到使用动规的方式来求解,那么为什么用动规呢, dp数组代表什么呢 ? 初始化是什么 , 遍历方式又是什么 ,这篇文章笔者将详细讲解背包问题的经典例题0-1背包问题和完全背包问题的解题方式,希望能帮助到大家 有人一提到背包问题就只会使用动态规划来

    2024年02月06日
    浏览(48)
  • 【第二十五课】动态规划:完全背包问题(acwing-3 / 公式推导 / 思路理解 / 优化 / c++代码)

    目录 思路 朴素代码 优化 公式推导上  二维代码  一维代码 公式理解上   在开始看完全背包问题之前,可能需要先了解01背包及其解决办法。 指路👇 【第二十五课】动态规划:01背包问题(acwing-2 / 思路 / 含一维数组优化 / c++代码) 这个问题和01背包的区别就是 每件物品可以

    2024年03月19日
    浏览(51)
  • 数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)

    目录 题目描述 输入示例 输出示例 解题思路  解题方法(C语言) 解析 有序的二叉树遍历可以用堆栈以非递归的方式实现。 例如: 假设遍历一个节点数为6的二叉树(节点数据分别为1到6)时, 堆栈操作为:push(1);push(2);push(3);pop();pop();push(4);pop()

    2024年02月07日
    浏览(36)
  • 动态规划算法解决背包问题,算法分析与C语言代码实现,时间效率解析

    🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨,经典算法的解析✨都在这儿,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 -  数据结构与算法_勾栏听曲_0 🍻欢迎大家  🏹  点赞👍  评论📨  收藏⭐️ 📌个人主

    2023年04月16日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包