01 背包
这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。
用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:
for i in range(0, n):
for j in range(0,limit):
if j >= w[i]:
F[i][j] = max(F[i - 1][j], F[i - 1][j - w[i]] + v[i])
else:
F[i][j] = F[i - 1][j]
可以改成滚动数组版本:
int flag = 0;
for i in range(0, n):
for j in range(0,limit):
if j >= w[i]:
F[flag^1][j] = max(F[flag][j], F[flag][j - w[i]] + v[i])
else:
F[flag^1][j] = F[flag][j]
flag^=1
还可以根据01背包每件物品只能放一次的性质,我们从大往小遍历背包容量:
for i in range(0, n):
for j in range(limit, 0):
if j >= w[i]:
F[j] = max(F[j], F[j - w[i]] + v[i])