1、0-1背包问题
有一个容量为 C 的背包,和一些物品。这些物品分别有两个属性,体积 w 和价值 v,每种物品的数量只有一个。要求用这个背包装下价值尽可能多的物品,求该最大价值,背包可以不被装满。
假设物品的体积w[i]=[5,6,2,3,4],物品的价值v[i]=[6,12,5,6,6],背包容量C=10,求背包能装的最大价值。
- 解题参考
- js解题代码
funciton bag_0_1(w,v,C) {
// 先对F[i][j]初始化第一行,然后根据遍历物品,根据状态转移函数计算。
// 把F第一行初始化为0,否则有的编译器通过不了;
let F = Array.from(Array(1), () => Array(10).fill(0));
// 用于动态规划的第一行数据: 只装走第一个物品的最大值
for(let j = 0; j <= C; j++) {
// 如果重量大于第一个物品的重量,也即是能装下,那么最大价值如下:
if(j >= w[0]) {
F[0][j] = v[0];
}
}
// F[i][j]前i+1个物品中,当最大背包容量为j时,背包能装载的最大价值
for(let i = 1; i < w.length; i++) {
for(j = 0; j <= C; j++) {
// 如果背包容量可以装下当前物品,那么最大价值:(1)不装当前物品(2)装当前物品
if(j >= w[i]) {
F[i][j] = Math.max(F[i-1][j], F[i-1][j-w[i]] + v[i])
} else {
F[i][j] = F[i-1][j];
}
}
}
return F[w.length-1][C];
}
【leetCode题目实战】
2、完全背包问题
有一个容量为 C 的背包,和一些物品。这些物品分别有两个属性,体积 w 和价值 v,每种物品的数量都有无限个。要求用这个背包装下价值尽可能多的物品,求该最大价值,背包可以不被装满。
-
js解题代码
funciton bag_0_1(w,v,C) {
// 先对F[i][j]初始化第一行,然后根据遍历物品,根据状态转移函数计算。
// 把F第一行初始化为0,否则有的编译器通过不了;
let F = Array.from(Array(1), () => Array(10).fill(0));
// 确定动态规划的边界,初始化
for(let j = 0; j <= C; j++) {
// 当i=0时,F[0][j]表示只考虑第一件物品,容量为j的背包中能装载的最大价值。因为背包智能装一件物品,那么当然要尽可能多地装,所以F[0][j]=(j/w[0])*v[0]
F[0][j] = (j/w[0]) * v[0];
}
// F[i][j]前i+1个物品中,当最大背包容量为j时,背包能装载的最大价值
for(let i = 1; i < w.length; i++) {
for(j = 0; j <= C; j++) {
//状态转移方程的处理
// 不放
F[i][j]=F[i-1][j];
// 放n个
let k=j/w[i];
while(k)
{
F[i][j]=max(F[i][j],F[i-1][j-k*w[i]]+k*v[i]);
k--;
}
}
}
return F[w.length-1][C];
}
【leetCode题目实战】