为了以免自己遗忘这种优化方法的思想,所以写这篇博客当做笔记。
01背包问题的朴素版解
#include<iostream>
using namespace std;
const int N = 1010;
int n , s;
int v[N] , w[N];
int f[N][N];
int main()
{
cin >> n >> s;
for(int i = 1 ;i <= n; i++ ) cin >> v[i] >> w[i];
for(int i = 1; i <= n; i++)
for(int j = 0; j <= s; j++)
{
f[i][j] = f[i-1][j];
if(j >= v[i]) f[i][j] = max(f[i][j] , f[i-1][j-v[i]]+w[i]);
}
cout << f[n][s] << endl;
return 0;
}
首先我们注意到在状态转移的过程中,我们始终只用到了 f[i] 和 f[i-1] 这两层,i-1层 储存的数据可以看成是在循环的上一次计算的量,即这一次循环的 f[i-1] 数据是上一次循环中 f[i] 的数据。
因此我们只需要关注循环层数之间数据的计算。于是我们直接去掉第一维,那么此时 f[i][j] = f[i-1][j] 改成