Skip to content

Instantly share code, notes, and snippets.

@scriptonian
Last active March 16, 2018 03:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save scriptonian/8662880708560143d7cf03c372e7184a to your computer and use it in GitHub Desktop.
Save scriptonian/8662880708560143d7cf03c372e7184a to your computer and use it in GitHub Desktop.
0 - 1 knapsack javascript
function knapsack(itemsNumber, capacity, weights, values) {
var finalResult;
if(itemsNumber === 0 || capacity === 0) {
finalResult = 0;
} else if(weights[itemsNumber] > capacity) {
finalResult = knapsack(itemsNumber - 1, capacity, weights, values);
} else {
var dontPutInKnapsack = knapsack(itemsNumber - 1, capacity, weights, values);
var putInSack = values[itemsNumber] + knapsack(itemsNumber - 1, capacity - weights[itemsNumber], weights, values);
finalResult = Math.max(dontPutInKnapsack, putInSack);
}
//return the final result
return finalResult;
}
var itemWeights = [null, 1, 3, 2, 5, 4],
itemValues = [null, 2, 4, 6, 8, 5],
numberOfItemsToConsider = 10,
totalNumberOfItems = 5;
var maximizeTotal = knapsack(totalNumberOfItems,
numberOfItemsToConsider,
itemWeights,
itemValues);
console.log('Recursion Maximum is : ', maximizeTotal); //returns 18
/*
* USING DYNAMIC PROGRAMMING:
* in this approach we are doing to store the number of items (n) and the
* capacity in a two dimensional array
* dpArr = [ [a, b], [c, d], [e, f] ]
* therefore dpArr[0][0] => a; or dpArr[0][1] => b;
*/
var dpArr = [
[undefined,undefined],
[undefined, undefined],
[undefined, undefined],
[undefined, undefined],
[undefined, undefined],
[undefined, undefined]
];
function knapsackDP(itemsNumber, capacity, weights, values) {
var finalResult;
//check to see if the result is already stored in the array. if it is return that instead
if(dpArr[itemsNumber][capacity] !== undefined) {
return dpArr[itemsNumber][capacity];
}
//define basecase. if capacity or number of items is zero, then final result is zero
if(itemsNumber === 0 || capacity === 0) {
finalResult = 0;
} else if(weights[itemsNumber] > capacity) {
finalResult = knapsackDP(itemsNumber - 1, capacity, weights, values);
} else {
var dontPutInKnapsack = knapsackDP(itemsNumber - 1, capacity, weights, values);
var putInSack = values[itemsNumber] + knapsackDP(itemsNumber - 1, capacity - weights[itemsNumber], weights, values);
finalResult = Math.max(dontPutInKnapsack, putInSack);
}
//save the result in the array
dpArr[itemsNumber][capacity] = finalResult;
//return the final result
return finalResult;
}
var maximizeTotalDP = knapsackDP(totalNumberOfItems,
numberOfItemsToConsider,
itemWeights,
itemValues);
console.log('Dynamic Programming Maximum is : ', maximizeTotalDP); //returns 18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment