哈喽,大家好,这是我用CSDN写文章的第二天啦!
上篇文章和大家讲了一下用二维数组解01背包的方法,今天再和大家分享一下01背包一维数组的解法。
没看过上篇文章的建议先去看看上篇文章。
题目还是昨天那道题目:
【题目描述】
一个旅行者有一个最多能装 M 公斤的背包,现在有 n 件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn,求旅行者能获得最大总价值。
【输入】
第一行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30);
第2..N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。
【输出】
仅一行,一个数,表示最大总价值。
【输入样例】
10 4 2 1 3 3 4 5 7 9
【输出样例】
12
关于【数据储存】、【算法分析】这两部分内容我在上篇文章已经分享了,感兴趣的可以先去看看。
【为什么可以用一维数组】
通过二维数组的递推公式dp[i][j]=max(dp[i-1][j],dp[i-1][j-s[i].w]+s[i].v)可以发现,每层数据都是由上一层得来的,所以可以压缩成一维数组。
【dp数组含义】
我们还是像用二维数组一样先来分析dp数组的含义。
二维dp数组中,dp[i][j]指的是第i件物品放进背包容量为j的背包里的最大价值。
现在压缩成一维数组后,dp[j]指的其实就是背包容量为j的背包的最大价值。
【递推公式】
二维数组的递推公式是dp[i]