인터뷰 중 배낭 알고리즘 질문을 접했습니다. 기존 배낭과는 약간 다릅니다. 배낭의 용량과 다양한 품목의 무게를 고려하여 배치된 품목의 총 질량이 최대한 비슷해야 합니다. 배낭의 용량은 배낭의 용량보다 작고, 최소한의 물품을 넣으십시오. 이 기사에서는 JS에서 구현된 동적 프로그래밍 백팩 알고리즘을 주로 공유하여 모든 사람에게 도움이 되기를 바랍니다. function Backpack() {
var totalWeight;//背包的总质量 var goodsList = [];//可供选择的物品列表 var bestMethodList = []//最优解的物品列表 //设置背包总重量 this.setTotalWeight = function(t) { totalWeight = t } //加物品 this.addThing = function(goods) { goodsList.push(goods) } //减物品 this.removeThing = function(goods) { var index = null goodsList.forEach(function(everyGoods,i){ if(everyGoods === goods){ index = i } }) if(index){ goodsList.splice(index,1) } else{ return false } } //计算最优解背包的重量 this.count = function() { return getListWeight(bestMethodList) } //传入物品列表,返回该列表所有物品总质量 function getListWeight(list) { var weight = 0 list.forEach(function(everyGoods, i) { weight += everyGoods.weight }) return weight } //满足尽可能接近背包重量且放入物品最少的方法 this.getBestMethod = function() { var arr = [] //这里只需要两个参数 设置的重质量totalWeight和可供选择的物品goodsList goodsList.forEach(function(everyGoods, i) { arr[i] = []//创建一个二维数组,放对应位置的最优解 for (let j = 0; j < totalWeight; j++) { if(j+1 > everyGoods.weight) { var newArr = [everyGoods] if(i > 0){ var overWeight = j - everyGoods.weight arr[i - 1][overWeight] ? newArr = newArr.concat(arr[i-1][overWeight]) : null if(getListWeight(newArr) < getListWeight(arr[i-1][j])) { newArr = arr[i-1][j] } else if(getListWeight(newArr) === getListWeight(arr[i - 1][j]) && arr[i-1][j].length < newArr.length){ newArr = arr[i-1][j] } } arr[i][j] = newArr } else{ if(i === 0){ arr[i][j] = null } else{ arr[i][j] = arr[i-1][j] } } } }) return bestMethodList = arr[goodsList.length-1][totalWeight-1] } } //测试 var myBag = new Backpack() myBag.setTotalWeight(10) myBag.addThing({name:'apple',weight:1}) myBag.addThing({ name: 'tomato', weight:3 }) myBag.addThing({ name: 'ball', weight: 5 }) myBag.addThing({ name: 'eggplant', weight: 4 }) console.log(myBag.getBestMethod())//最优解的数组 console.log(myBag.count())//最优解的质量
2차원 배열을 만들어 국소 최적해를 저장한 후 천천히 추론하여 최종 최적해를 얻는 것이 핵심입니다. + . arr[i-1][나머지 배낭 질량] + 현재 항목(concat 사용)
3. 새 arr을 이전 행의 j열 arr과 비교합니다(초기 조건이 다른 경우 변경하면 됩니다). 4. 차례로 arr을 얻습니다
관련 권장사항:
JavaScript 고급 알고리즘 동적 프로그래밍 예제 분석 php 동적 프로그래밍 학습 알고리즘 PHP 0-1 배낭 문제를 해결하기 위한 동적 프로그래밍 예제 분석_PHP 튜토리얼위 내용은 JS는 동적 프로그래밍 배낭 알고리즘을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!