背包问题详解

来源:互联网 发布:java注解是什么 编辑:程序博客网 时间:2024/04/30 21:17

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])

完全背包

0 0
原创粉丝点击