0-1背包问题是比较经典的动态规划,题意如下:
给定n件物品的重量和对应价值,给定一个背包的最大承重,求该背包所能装下的物品的最大价值,并输出哪几件装进了背包。
这个问题可以用一个二维数组来做,这样非常直观明了。但是有些情况下,数据过大,采用二维数组会超空间,所以需要采用一维数组进行空间压缩,复杂度是不变的,要注意的是填充一维数组时需要倒序。每次更新一遍一维数组,其实就相当于二维数组的更新。
下面是二维数组的方法,一维数组的方法在其后:
最关键的一个公式是
d[i][j] = max(d[i - 1][j], d[i - 1][j - w[i]] + v[i]);
其中,d[i][j]是指在前i件物品中,选择若干件放在承重为j的背包中,可以取得的最大价值。
先给出d[i][j]这个矩阵的示意图,因为我觉得在编程实现
过程中一直想着这个矩阵,思路会清晰很多。
这里,我统一把数组的第0个元素置为零,不使用(即:在上面的矩阵中,第0列全是0,不使用,就没有画出来。数组中的1就代表第一个)
代码如下,注释说的很清楚了:
#include <iostream>
#include<algorithm>
using namespace std;
//d[i][j]是一个矩阵,表示在前i件物品中,选择若干件放在承重为j的背包中,可以取得的最大价值
int main(){
int