公共部分
- 变量说明:
w[i]是重量
v[i]是价值
N是物品种类数目
V是背包总容量
f[i]表示将物品放入容量为i的背包能获得的最大价值
01背包
- 思路:
有N种物品,每种物品只有1个
初始化:f[0: V] = 0
for i = 1: N
for j = V: w[i](倒着遍历)
f[j] = max(f[j], f[j - w[i]] + v[i])
i 遍历物品,j 遍历容量,f 的方括号里面是容量而不是物品件数,因此转移方程是 f[j] 而不是 f[i]
- 代码:
#include <bits/stdc++.h>
using namespace std;
#define N 10000
int f[N + 5];
int main()
{
int V, N;
for(int i = 1; i <= V; ++i) f[i] = 0;
for(int i = 1; i