알고리즘 기초 다지기 프로젝트 (feat. 코드없는 프로그래밍) [2021년 07월 08일]
(0-1) Knapsack Problem 이해하기
요약
- (0-1) Knapsack Problem (배낭문제)를 이해하기
- 따로 LeetCode 문제는 없음.
코드
const createDPTable = (nObjectCnt, nWeightLimit) => {
const arrDP = Array.from({ length: nObjectCnt + 1 }, () =>
Array.from({ length: nWeightLimit + 1 }, () => null),
);
for (let colIdx = 0; colIdx < nWeightLimit + 1; colIdx++)
arrDP[0][colIdx] = 0;
for (let rowIdx = 0; rowIdx < arrDP.length; rowIdx++)
arrDP[rowIdx][0] = 0;
return arrDP;
};
const knapsack = (objectItems, nWeightLimit) => {
if (!objectItems || objectItems.length <= 0) return;
if (nWeightLimit < 0) return;
const arrDP = createDPTable(objectItems.length, nWeightLimit);
for (let rowIdx = 1; rowIdx < arrDP.length; rowIdx++) {
for (let colIdx = 1; colIdx < arrDP[rowIdx].length; colIdx++) {
const prevRowIdx = rowIdx - 1;
const prevRowColValue = arrDP[prevRowIdx][colIdx];
const { weight, value } = objectItems[rowIdx - 1];
let resultValue = 0;
const prevWeightLimit = colIdx - weight;
if (prevWeightLimit < 0) resultValue = 0;
else resultValue = arrDP[prevRowIdx][prevWeightLimit] + value;
arrDP[rowIdx][colIdx] = Math.max(prevRowColValue, resultValue);
}
}
console.log(arrDP);
return arrDP[objectItems.length][nWeightLimit];
};
const objectItems = [
{ weight: 1, value: 30 },
{ weight: 2, value: 20 },
{ weight: 3, value: 40 },
{ weight: 4, value: 10 },
];
knapsack(objectItems, 5);
참고 이미지 및 동영상
-
Bottom-Up
-
이미지
-
이미지 GIF (위 로직 😱 부분)
참고 자료
강의
자료
알고리즘 기초 다지기 프로젝트 (feat. 코드없는 프로그래밍) [2021년 07월 08일]
(0-1) Knapsack Problem 이해하기
요약
코드
참고 이미지 및 동영상
Bottom-Up
이미지
이미지 GIF (위 로직 😱 부분)
참고 자료
강의
자료