【动态规划】0 - 1背包问题(通俗易懂, 万能统一代码)
创始人
2024-06-02 14:32:26
0

0 - 1背包问题详解

什么是背包问题?

最常见的背包问题有0-1背包,完全背包,多重背包,分组背包这四种。什么是背包问题?

  • 简单来说就是:一个小偷背了一个背包潜进了金店,包就那么大,他如果保证他背出来所有物品加起来的价值最大。
  • 规范描述就是:有一个容量为 N 的背包,要用这个背包装下物品的价值最大,这些物品有两个属性:体积 w 和价值 v。

解题思路:

定义一个二维数组 dp 存储最大价值,其中 dp[i][j] 表示前 i 件物品体积不超过 j 的情况下能达到的最大价值。

设第 i 件物品体积为 w,价值为 v,根据第 i 件物品是否添加到背包中,可以分两种情况讨论:

  • 第 i 件物品没添加到背包,总体积不超过 j 的前 i 件物品的最大价值就是总体积不超过 j 的前 i-1 件物品的最大价值,dp[i][j] = dp[i-1][j]。
  • 第 i 件物品添加到背包中,dp[i][j] = dp[i-1][j-w] + v。

在这里插入图片描述

第 i 件物品可添加也可以不添加,取决于哪种情况下最大价值更大。因此,0-1 背包的状态转移方程为:
dp[i][j]=max⁡(dp[i−1][j],dp[i−1][j−w]+v)d p[i][j]=\max (d p[i-1][j], d p[i-1][j-w]+v)dp[i][j]=max(dp[i−1][j],dp[i−1][j−w]+v)

代码:(java)

// W 为背包总体积
// N 为物品数量
// weights 数组存储 N 个物品的重量
// values 数组存储 N 个物品的价值
public int knapsack(int W, int N, int[] weights, int[] values) {int[][] dp = new int[N + 1][W + 1];for (int i = 1; i <= N; i++) {int w = weights[i - 1], v = values[i - 1];for (int j = 1; j <= W; j++) {if (j >= w) {dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - w] + v);} else {dp[i][j] = dp[i - 1][j];}}}return dp[N][W];
}
空间优化

在程序实现时可以对 0-1 背包做优化。观察状态转移方程可以知道,前 i 件物品的状态仅与前 i-1 件物品的状态有关,因此可以将 dp 定义为一维数组,其中 dp[j] 既可以表示 dp[i-1][j] 也可以表示 dp[i][j]。此时,
dp[j]=max⁡(dp[j],dp[j−w]+v)d p[j]=\max (d p[j], d p[j-w]+v)dp[j]=max(dp[j],dp[j−w]+v)

因为 dp[j-w] 表示 dp[i-1][j-w],因此不能先求 dp[i][j-w],防止将 dp[i-1][j-w] 覆盖。也就是说要先计算 dp[i][j] 再计算 dp[i][j-w],在程序实现时需要按倒序来循环求解。

public int knapsack(int W, int N, int[] weights, int[] values) {int[] dp = new int[W + 1];for (int i = 1; i <= N; i++) {int w = weights[i - 1], v = values[i - 1];for (int j = W; j >= 1; j--) {if (j >= w) {dp[j] = Math.max(dp[j], dp[j - w] + v);}}}return dp[W];
}
无法使用贪心算法的解释

0-1 背包问题无法使用贪心算法来求解,也就是说不能按照先添加性价比最高的物品来达到最优,这是因为这种方式可能造成背包空间的浪费,从而无法达到最优。

考虑下面的物品和一个容量为 5 的背包,如果先添加物品 0 再添加物品 1,那么只能存放的价值为 16,浪费了大小为 2 的空间。最优的方式是存放物品 1 和物品 2,价值为 22.
在这里插入图片描述

变种

  • 完全背包:物品数量为无限个

  • 多重背包:物品数量有限制

  • 多维费用背包:物品不仅有重量,还有体积,同时考虑这两种限制

  • 其它:物品之间相互约束或者依赖

注:仅供学习参考!

相关内容

热门资讯

初中作文题材万能素材积累【精... 初中作文题材万能素材积累 篇一 随着社会的发展,人们对于环境保护的意识越来越强烈。环境污染已经成为...
亲切的怀恋作文(优选3篇) 亲切的怀恋作文 篇一怀恋已逝的时光记忆是一扇扇窗户,打开时可以穿越时光,回到过去。尽管时间已经过去了...
我真开心初一范文63篇 我真开心初一范文 第一篇我相信大家对于那些能够让自己开心快乐的事情肯定不会淡忘。在去年的时候,尤其是...
天堂寨之行初一作文(优质3篇... 天堂寨之行初一作文 篇一天堂寨之行初一暑假,我和家人一起来到了著名的旅游景点——天堂寨。这是一个位于...
消失在记忆里的光阴初中作文8... 消失在记忆里的光阴初中作文800字 篇一初中时光如流水般消失在我的记忆里,仿佛昨日的事情转眼间已经过...
难忘的一件事作文初一600字... 难忘的一件事作文初一600字 篇一我难以忘怀的一件事发生在我小学五年级的时候。那是一个晴朗的春天,阳...
初中散文:人间有真情(精选5... 初中散文:人间有真情 篇一人间有真情人间有真情,是一种温暖的存在。我还记得那个夏天,当我意外受伤时,...
在回家的路上初中作文【经典5... 在回家的路上初中作文 篇一回家是每天都要经历的事情,也是我最期待的时刻。每天放学后,我都会急匆匆地赶...
初中作文《七年级生活二三事》... 初中作文《七年级生活二三事》 篇一我是一名七年级的学生,回顾这一年来的生活,有许多值得分享的事情。在...
那时花开初中作文600字(优... 那时花开初中作文600字 篇一:回忆中的花开那时花开初中作文600字 篇二:花开的季节那时花开初中作...
作文那一幕让我难忘600字初... 作文那一幕让我难忘600字初一作文 篇一作文那一幕让我难忘我记得那是一个阳光明媚的早晨,我们班上的语...
再见了,亲爱的母校_初中记叙... 再见了,亲爱的母校_初中记叙文 篇一初中时光即将结束,我站在母校门口,心中涌上一股复杂的情感。这个学...
自信初中作文(最新6篇) 自信初中作文 篇一自信是一种重要的品质,它是我们面对困难和挑战时的力量源泉,也是我们取得成功的关键。...
他的勤奋影响了我初一作文85... 他的勤奋影响了我初一作文850字 篇一初中生活对于每一个学生来说都是一个全新的开始,充满了挑战和机遇...
不一样的春节作文【精选6篇】 不一样的春节作文 篇一春节是中国最重要的传统节日之一,它象征着团圆和喜庆。每年的春节,人们都会回到家...
黑板上的记忆初一作文(推荐6... 黑板上的记忆初一作文 篇一初一的时候,我对黑板上的记忆有着深刻的印象。每天上课,老师总是在黑板上写下...
在考场作文650字【优质5篇... 在考场作文650字 篇一勇敢面对挑战,实现梦想在人生的道路上,我们常常会遇到各种各样的挑战。无论是学...
我们的教学大楼初中英语作文(... 我们的教学大楼初中英语作文 篇一Our Teaching BuildingOur teaching ...
国庆节初中作文600字【实用... 篇一:国庆节的意义国庆节初中作文600字 篇一国庆节是我国最重要的节日之一,也是全国人民欢庆的日子。...
我们是一家人初中作文(精彩6... 我们是一家人初中作文 篇一我们是一家人家,是一个温暖的港湾,是我们成长的地方。而我们这个家庭,不仅仅...