动态规划之0-1背包问题(详解+分析+原码)

前面的话

本篇文章将介绍算法专题之动态规划中的背包问题,更准确的说是背包问题中最简单的一种类型,即0-1背包问题,就是给你一定容量的背包和若干物品,每种物品只能选一次,告诉你每件物品的价值和体积,求背包里面物品的最大总价值。

??博客主页:的博客主页
??欢迎关注??点赞??收藏留言??
??本文由原创,CSDN首发!
??首发时间:??2022年5月8日??
坚持和努力一定能换来诗与远方!
??推荐书籍:??《算法》,??《漫画算法》
??参考在线编程网站:??牛客网??力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
??作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!


??导航小助手??


封面区

背包问题:泛指一类「给定价值与成本」,同时「限定决策规则」,在这样的条件下,如何实现价值最大化的问题。
0-1背包:「01背包」是指给定物品价值与体积(对应了「给定价值与成本」),在规定容量下(对应了「限定决策规则」)如何使得所选物品的总价值最大。 (来自宫水三叶)


0-1背包问题

??题目详情

有 N 件物品和一个容量是 V 的背包。每件物品有且只有一件。

第 i 件物品的体积是v[i] ,价值是w[i] 。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。

示例 1:

输入: N = 3, V = 4, v = [4,2,3], w = [4,2,3]
输出: 4
解释: 只选第一件物品,可使价值最大。

示例 2:

输入: N = 3, V = 5, v = [4,2,3], w = [4,2,3]
输出: 5
解释: 不选第一件物品,选择第二件和第三件物品,可使价值最大。

??解题思路

分析:

这道题目的意思是给你一堆物品,每种物品只有一件,然后就是在这些物品中选一部分放入背包,在不超过背包容量的情况下,求背包里面物品的最大总价值。

??朴素0-1背包通解

状态定义:

本质上就是从i个物品中选择一定数量的物品在一定空间限制的前提下,求这些物品的最大总价值,我们可以定义一个二维数组dp[i][j],这个数组的值就表示从前i件物品进行选择,在不超过容量j的前提下所满足最大的物品总价值。(注:此处的第i件物品对应与数组下标i

确定初始状态:

当只有一个物品时,如果该物品的体积v不大于背包容量j,则初始值dp[0][j]=v,否则dp[0][j]=0

状态转移方程:

对于第i件物品,设它的所占容量为v[i],价值为w[i],我们可以选择该物品也可以不选择该物品,如果不选择该物品则 d p [ i ] [ j ] = d p [ i 1 ] [ j ] dp[i][j]=dp[i-1][j] dp[i][j]=dp[i1][j],如果选择该物品有两种情况:

  • 背包剩余空间不够了,那么此时就无法选择该物品, d p [ i ] [ j ] = d p [ i 1 ] [ j ] dp[i][j]=dp[i-1][j] dp[i][j]=dp[i1][j]。
  • 背包剩余空间充足,那么此时的物品总价值为 d p [ i ] [ j ] = d p [ i 1 ] [ j v [ i ] ] + w [ i ] dp[i][j]=dp[i-1][j-v[i]] + w[i] dp[i][j]=dp[i1][jv[i]]+w[i]。

综上,转移方程为 d p [ i ] [ j ] = m a x ( d p [ i 1 ] [ j ] , d p [ i 1 ] [ j v [ i ] ] + w [ i ] ) dp[i][j]=max(dp[i-1][j], dp[i-1][j-v[i]]+w[i]) dp[i][j]=max(dp[i1][j],dp[i1][jv[i]]+w[i])。

实现代码:

    /**
     *
     * @param N 物品数
     * @param C 背包容量
     * @param v 每件的体积
     * @param w 每件物品的价值
     * @return 最大价值
     */
    public int zoKna
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值