leetcode 题解 (0-1 背包问题)
主要介绍 0-1 背包问题, 及一些 leetcode 题解
0-1 背包问题
定义
有一个背包, 他的容量为 C(Capacity). 现在有 n 中不同的物品, 编号为 0...n-1, 其中每一件物品的重量为 w(i), 价值为 v(i). 问可以向这个背包中盛放哪些物品, 使得在不超过背包容量的基础上, 物品的总价值最大.
解题思路
这类组合问题, 我们都可以使用递归来完成. 只是我们在其中能不能找到重叠子问题, 最优子结构进而转化成记忆化搜索或动态规划来解决.
对于这个问题, 我们有两个约束条件
首先我们要在 n 个物品里选
第二点他的容量要小于等于一个给定的数值 C.
状态定义
注意这个问题要使用两个变量来定义状态.
F(n,C)考虑将 n 个物品放进容量为 C 的背包, 使得价值最大.
状态转移
对于 F(i,c), 有两种情况, 将第 i 个物品加入和直接忽略第 i 个物品
F(i,C) = max{F(i-1, C), v(i) + F(i-1, C-w(i))}
代码实现
记忆化搜索法classKnapsack01{
private:
vector>memo;
// 用 [0...index]的物品, 填充容积为 c 的背包的最大价值
intbestValue(constvector&w,constvectorv,intindex,intc){
if(c<=0||index<0){
return0;
}
if(memo[index][c]!=-1){
returnmemo[index][c];
}
intres=bestValue(w,v,index-1,c);
if(c>=w[index]){
res=max(res,v[index]+bestValue(w,v,index-1,c-w[index]));
}
memo[index][c]=res;
returnres;
}
public:
intknapsack01(constvector&w,constvector&v,intC){