主要原理是将一个大背包拆成小背包,看每个小背包中能转载的最大价值,以下是每个格子的最大价值公式
ceil[ i ][ j ]=max( ceil[ i-1 ][ j ] ,i行的价值+ ceil[ i-1 ][ j- i行的价值])
/*
@param [[cost,value],[cost,value]] 商品的花费和价格数组
@param opacity 容量
@param opint 粒度
@return maxValue
*/
function package(arr,opacity,point=1){
let valueArr=new Array(arr.length);
for(let i=0;i<arr.length;i++){
valueArr[i]=[];
}
for(let i =0;i<arr.length;i++){
const itemCost=arr[i][0];
const itemValue=arr[i][1];
for(let j=0;j<=opacity;){
if(i==0){
valueArr[i][j]=j>=itemCost?itemValue:0;
}else{
const extraCost=j>=itemCost?(itemValue+valueArr[i-1][j-itemCost]):0;
valueArr[i][j]=Math.max(valueArr[i-1][j]||0,extraCost)
}
j+=point
}
}
return valueArr[arr.length-1][opacity/point]
}
const itemArr=[[4,3000],[1,15000],[3,222000]];
const opacity=4;
console.log(package(itemArr,opacity));