这周依然在主攻dp算法,而这周相对于前两周不同的是,这周主要在讲背包问题。
背包问题是dp算法中一个重点问题。她一共分为三种题型:01背包问题,完全背包问题和多重背包问题。首先,01背包问题是这三个问题中最简单,也是最基础的一个。下面我会列举一个我认为非常有代表性,并且一看就懂的问题。也正是这个问题,让我对背包问题有了一个初步的了解。
题目:一个小偷面前有一堆(n个)财宝,每个财宝有重量w和价值v两种属性,而他的背包只能携带一定重量的财宝,在已知所有财宝的重量和价值的情况下,如何选取财宝,可以最大限度的利用当前的背包容量,取得最大价值的财宝(或求出能够获取财宝价值的最大值)。
分析:限定每个物品要么拿(1个)要么不拿(0个),这就是背包问题的本质。
这个问题有两个维度,一个是当前物品i,另一个是当前容量c,于是我们可以用f[n,C]来表示将n个物品放入容量为C的背包可以得到的最大收益,而第i个物品无非拿与不拿两种情况,因此可以表示为:
f[i][c] = max( f[i - 1][c], f[i - 1][c - w[i]] + v[i]。
同时,想让此状态方程成立需要条件,即w[i] <= c,否则f[i][c] = f[i - 1][c]。
通过这题,我也看出01背包问题有时候也会有边界,这就类似于之前的递归问题。所以在求出状态转移方程之后,还需要寻找有无边界。
完全背包问题我现在依然在攻克中,既然01背包问题我已经攻克了,我相信完全背包问题的攻克也只是时间问题。
加油吧,少年。你可以的!
第八周学习总结
最新推荐文章于 2023-08-31 17:24:15 发布