这阵子发现好多大厂技术面发现都有动态规划问题,背包问题就是最经典的动态规划问题之一,看了许久,大概了解了思路,以下是迭代方式实现背包问题解决方案:
/**
* @description 求不超过容器容积的情况下能装入的最大价值,每个物品仅限使用一次,即:0-1背包问题
* @param Array vo 表示每个物品的体积和价值
* @param number con 容量
*/
function getMaxValue(vo,con){
let dp = [];
let len = vo.length;
for(let i = 0; i < len; i ++){
dp[i] = []
for(let n = 0; n <= con; n ++){
if(i === 0){
dp[i][n] = 0
}else{
if(vo[i].vo <= n){
if(dp[i - 1][(n - vo[i].vo)] + vo[i].va > dp[i - 1][n]){
dp[i][n] = dp[i - 1][(n - vo[i].vo)] + vo[i].va
}else{
dp[i][n] = dp[i - 1][n]
}
}else{
dp[i][n] = dp[i - 1][n]
}
}
}
}
return dp
}
let vo = [
{
vo: 0,
va: 0,
},
{
vo: 1,
va: 2
},
{
vo: 2,
va: 4
},
{
vo: 3,
va: 4
},
{
vo: 4,
va: 5
}
]
let con = 5
let dp = getMaxValue(vo,con)
console.table(dp)
console.log('可放置物品的最大价值为',dp.flat().pop())
运行结果如下: