这是别人的代码,我只能看出原理大概类似二维数组,能为我解答一下为什么选择f[j-v]吗
#include
using namespace std;
const int N = 20010;
int f[N]={0};
int n, m;
int main(){
cin>>m;
cin>>n;
for(int i = 1; i <= n; i++){
int v;
cin>>v;
for(int j = m; j >= v; j--)
f[j] = max(f[j] , f[j-v] + v);
}
cout<return 0;
}
常规解法: f[i][j]表示背包容量为j时,前i个物品能放的最小剩余空间,你这种是省空间的写法,简化了但是思想是一样的
def func():
f = [[V for i in range(V + 1)] for j in range(n + 1)]
for i in range(1, n + 1):
for j in range(0, V + 1):
if j >= a[i]:
f[i][j] = min(f[i - 1][j], f[i - 1][j - a[i]] - a[i])
else:
f[i][j] = f[i - 1][j]
print(f[n][V])