背包问题
背包问题(Knapsack problem)是一种组合优化的NP完全(NP-Complete,NPC)问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。本章所有的背包问题讨论均使用 集合的思想求解背包问题。一般来讲,背包问题有以下几种分类:
1.01背包
2.完全背包
3.多重背包
4.分组背包
01背包问题
一般01背包问题
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。
第 i 件物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
用状态表示和状态计算解决背包问题:
状态表示:f[i][j]表示使用前i个物品,体积不超过j的最大价值
状态转移:状态转移从最后一个物品分析,考虑不重不漏的情况:
1.分为使用第i个物品;
2.不使用第i个物品。
则
f [ i ] [ j ] = m a x { f [ i − 1 ] [ j ] ; 不 选 第 i 个 物 品 f [ i − 1 ] [ j − v i ] + w i ; 选 第 i 个 物 品 f[i][j] =max\begin{cases} f[i - 1][j];不选第i个物品\\ f[i - 1][j - v_i] + w_i;选第i个物品\\\end{cases} f[i][j]=max{
f[i−1][j];不选第i个物