拿下大厂offer,只要搞定小小“背包”?

背包问题,一直以来雄踞Google、Facebook等一线大公司面试题型必考榜首,同时,也是一不留神就会跪的面试题。

一听背包问题就发怵?

不用担心,其实,背包问题也没那么难。

1.什么是背包问题?

背包问题 (Knapsack problem) 是一种组合优化的NP完全问题。

一般来说,就是给定一组有固定价值和固定重量的物品,以及一个已知最大承重量的背包,求在不超过背包最大承重量的前提下,能放进背包里面的物品的最大总价值。

v2-6fc1150fbb9af0f4ea680b29f2ebea23_b.jpg

如果用一句话形象地描述,大概就是:有个小偷半夜闯入豪宅,可以偷的东西非常多,但是负重能力有限,偷哪些东西才更加不枉此行?(误)

这一类问题是典型的使用动态规划解决的问题,我们可以把背包问题分成3种不同的子问题:0-1背包问题、完全背包和多重背包问题,剩下一些都是这3种的变形以及组合。

  • 01背包

有 N 件物品和一个容量为 V 的背包,第 i 件物品消耗的容量为 Ci,价值为 Wi,求解放入哪些物品可以使得背包中总价值最大。

  • 完全背包

有 N 种物品和一个容量为 V 的背包,每种物品都有无限件可用,第 i 件物品消耗的容量为 Ci,价值为 Wi,求解放入哪些物品可以使得背包中总价值最大。

  • 多重背包

有N种物品和一个容量为V的背包,第 i 种物品最多有 Mi 件可用,每件物品消耗的容量为 Ci,价值为 Wi,求解放入哪些物品可以使得背包中总价值最大。

2.背包问题的难点在哪里?

三种背包问题都有一个共同的限制,那就是背包容量,背包的容量是有限的,这便限制了物品的选择,而三种背包问题的共同目的,便是让背包中的物品价值最大。

不同的地方在于物品数量的限制,不过虽然三种背包问题对于物品数量的限制不一样,但都可以转化为01背包问题来进行思考。 所以说,01背包问题是所有背包问题的基础,弄懂了01背包问题后,完全背包和多重背包就没有什么困难的地方了

v2-40076bc7f96ed1580c25fd197c968c0e_b.jpg

但真正在面试中,你可能会遇到很多背包问题的变形。如果你没有一双火眼金睛,一眼看出题目的本质其实是个背包问题,你可能会走很多弯路。
如:

  • Target sum 问题(LintCode链接:Target sum
  • Airbnb的menu order 问题(点菜,菜的价格为double, 问如何正好花完手中的钱)

本质上都是背包问题,很多同学没有看透问题的真面目,会觉得每道题都是独立的,很难做到举一反三,于是就深陷其中不得章法,如果把背包问题的几种类型都弄懂,类似的很多题其实都能迎刃而解了。

3.经典背包问题及其题解

背包问题都有哪些经典例题呢?

01背包

在N个物品中挑选若干物品装入背包,最多能装多满?
假设背包的大小为V,第i个物品的大小为C[i]
注意:你不可以将物品进行切割。
有N件物品和一个容量为V的背包。放入第i件物品耗费的费用是Ci,得到的价值是Wi。求解将哪些物品装入背包可使价值总和最大?

完全背包

给出一个都是正整数的数组 nums,其中没有重复的数。从中找出所有的和为 target 的组合个数。
注意:一个数可以在组合中出现多次。数的顺序不同则会被认为是不同的组合。

想要更好地掌握背包问题,去听《背包四讲》吧~基础知识和刷题都能cover到。

这门原价$199的课程,现在免费领啦:

  1. 戳我免费试听后,加微信号jiuzhang15,回复「知乎背包」+试听截图;
  2. 邀请2位未注册过九章官网的新朋友入群,组成3人学习小组;

3人都可领全额抵价券,0元听课!

发布了438 篇原创文章 · 获赞 64 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/JiuZhang_ninechapter/article/details/103666887