01背包的实质其实是动态规划,而01背包的核心问题就是:给定一定的容量体积,给一定数量的物品,每个物品的价值不一样,问在不超过总体积的情况下,拿到的物品的最大的价值是多少。
每次下手之前我都不懂为什么要用dp,通过做了几道题,我发现会有规律,就是所有的题目不会告诉你,她要用dp,而是会给你隐含的条件,首先,在这个背包问题中,你的所有物品之和,不能超过总的体积,因此你如果想使用dp,就必须知道它的总体积是好多,然后才能成立一个数组,这个总体积必须是固定的,然后呢,体积是固定的,我们还要知道,在往背包里放东西的时候,我们必须是一整块一整块的放,不能说,把一个物体扮成两块,再放这种是肯定不行的,一定是一整块一整块的放,最后一点呢,是我们在固定体积内,要放置最大的最大的价值,这也是一个点。我们回看之前做过的题目。
例如这个题,如果一开始看就非常的隐晦,怎么才能使用dp,我们发现这个题目也是让我们选择一部分,然后使得最后的和相等,而这个和就是我们的体积。这是第一步,然后呢我们发现物体也是一个一个放的,然后呢,发现在该体积下,如果放置的结果刚好达到了哦我们整个背包体积的大小,那么就是可以。再看下一个。
这个就更隐晦了,我们一眼完全看不出是怎么一回事,但是我们静下来,发现就是把所有的石头分成两大部分,然后让他们一直撞,使得这两部分的之差越小越好,那么我们就把他们的和的1/2,拿出来,然后往里面放石头,这里的体积就是所有和的二分之一,往这个容量里放一整块一整块的石头,看看怎么放才能放到最大。然后,我们的石头也是一整块一整块放置的,最后在1/2的体积内,拿到的最大的石头的重量,就是其中一部分的质量。
再看这一个题,这个题,看起来和动态规划,完全没有关系。但是我们可以转换成动态规划的题,我们现在知道所有整数的和,1+1+1+1+1=5,然后目标为3;正+负=5;正-负=3;可以求出正的数值来,然后我们现在就确定了体积,就是在这些数字,随便挑,找到和为4的就行,找到体积后,我们发现每个数字确实是一整个的,不分开,然后最后的数值也是尽可能的取最大值,其实这里并没有特别的明显,只不过思路确实是这样的,这里使用的那个递推函数有点不一样,但是不影响做题,dp[i] = dp[i]+dp[i-nums[j]];记住我们是让所有的数字之和相加,相加!!!没有相减。
还有一个二维的题目,就是两个数字一起的那种,那么这种的就需要一个二维数组来保存。
找到一个合适的体积,这里的体积是5*3;就是说0不超过5,1不超过3,只不过变成了2维数组罢了,而且是同时的,选一个一个的符串,也是一个一个的,然后找到最多的个数。