背包问题模板:状态 + 选择
for 状态1 in 状态1的所有取值:
for 状态2 in 状态2的所有取值:
dp[状态1][状态2] = 择优(选择1,选择2)
0,1背包:不可重复选
一共有 n 件物品,第 i 件物品的重量为 w[i],价值为 v[i]。在总重量不超过背包承载上限m的情况下,能够装入背包的最大价值是多少?
dp[i][j]表示将前 i 件物品装进容量为 j 的背包可以获得的最大价值
for i = 1, 2, ..., n: # 枚举物品
for j = m, m-1, ... , w[i]: # 枚举容量;逆向;w[i] <= j: 第 i 个物品的容量必须小于 j 才选
# 不选第i个物品和选第i个物品 最大值价值
dp[i][j] = max(dp[i-1][j], dp[i-1][j-