昨天面試時遇到乙個揹包演算法的題目,和傳統的
揹包稍有不同,是給定揹包的容量和各種物品的重量,要求放入物品的總質量盡可能接近揹包的容量並小於揹包的容量,且放入的物品數目最少。
以下是我自己根據理解編寫出來的**。
function backpack()
//加物品
this.addthing = function(goods)
//減物品
this.removething = function(goods)
})if(index)
else
}//計算最優解揹包的重量
this.count = function()
//傳入物品列表,返回該列表所有物品總質量
function getlistweight(list) )
return weight
}//滿足盡可能接近揹包重量且放入物品最少的方法
this.getbestmethod = function()
else if(getlistweight(newarr) === getlistweight(arr[i - 1][j]) && arr[i-1][j].length < newarr.length)
}arr[i][j] = newarr
}else
else}}
})return bestmethodlist = arr[goodslist.length-1][totalweight-1]}}
//測試
var mybag = new backpack()
mybag.settotalweight(10)
mybag.addthing()
mybag.addthing()
mybag.addthing()
console.log(mybag.getbestmethod())//最優解的陣列
console.log(mybag.count())//最優解的質量
其中的核心便是建立乙個二維陣列儲存區域性的最優解,然後慢慢推演,最後獲得最終的最優解。
演算法原理:
(i對應行,j對應列,建立二維陣列arr)
1.揹包剩餘質量 = 當前列對應的重質量 - 當前行物品的質量
2.新的arr = arr【i-1】【揹包剩餘質量】 + 當前物品 (用concat)
3.新的arr 和 上一行j列的arr對比 (如果初始條件不同,只需要改這裡即可)
4.依次得出arr
01揹包演算法 動態規劃(c 實現)
0 1揹包問題 給定n種物品和一揹包。物品i的重量是wi,其價值為vi,揹包的容量為c。問應如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?在選擇裝入揹包的物品時,對每種物品i只有兩種選擇,即裝入揹包或不裝入揹包。不能將物品i裝入揹包多次,也不能只裝入部分的物品i。因此,該問題稱為0 1揹...
演算法 4 動態規劃揹包
容量 m kg 的揹包,另外有 i個物品,重量分別為 w 1 w 2 w i kg 價值分別為 p 1 p 2 p i 元 將哪些物品放入揹包可以使得揹包的總價值最大?最大價值是多少?我們要求得 i個物體放入容量為 m kg 的揹包的最大價值 記為 c i m 在選擇物品的時候,對於每種物品 i只有...
動態規劃 揹包
揹包經典問題 揹包問題01 乙個揹包容積為t 0 t 2000 現在有n 0 如下 includeusing namespace std int s 1005 bool f 3000 int main 揹包問題02 若每種物品有無限多個。從這n種物品中選取若干個裝入揹包內,使揹包所剩的空間最小。請求...