一、引言
在某些题中,背包容量与物品数量可能会超出空间范围,那么用什么方法可以省空间?
二、分析
让我们先看一下01背包的朴素二维数组解法:
01背包朴素空间解法_Chuckie_Z的博客-CSDN博客
#include<iostream>
using namespace std;
const int N = 1e3 + 5;
int dp[N][N], w[N], v[N]; //分别是dp数组、价格数组和容量数组
int m, n;
int main(){
scanf("%d%d", &m, &n); //m表示物品数量,n表示背包总容量
for(int i = 1; i <= m; i++){ //从1开始存,避免减一超范围
scanf("%d%d", &w[i], &v[i]); //每件物品的价格与容量
}
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
dp[i][j] = dp[i-1][j]; //不选这件物品
if(j >= v[i]){ //如果背包容量可以装下这个物品
dp[i][j] = max(dp[i-1][j], dp[i-1][j-v[i]] + w[i]); //就从选这个物品和不选这个物品中挑一个价值更大的
}
}