引言
前几天笔试网易,题目比华为难度高,但是其实都很常规,主要还是自己练习太少,很多题目都只是粗浅的看过,并没有理解其内涵。比如网易家这道关于双核CPU任务调度的,实际上就是01背包问题,当时记得见过这类问题,但是没有想到是01背包问题,不过就算想到了,我一时也不能马上写出来。因此,现在重新总结01背包问题,避免以后遇到类似问题没有头绪。
01背包问题
对于n个重量分别为 wj 的食物,有一个容量为K的背包,问能否从n个食物中选择一部分将背包完全塞满?(或问背包最多能装走多重的食物?)。可以利用01背包问题解决的类似问题有:如何将一个数组划分为两个数组,且这两个数组的元素和相等?
问题分析
假设 p(n,K) 代表n个食物且背包重量为K的问题的解,那么我们可以将问题分为两种情况:
- 若第n个食物是问题最优解的一部分,则 p(n