problem-solving/knapsack Home Manual Reference Source

src/integerValuesKnapsack.js

  1. import assert from 'assert';
  2.  
  3. import {sum} from '@iterable-iterator/reduce';
  4.  
  5. /**
  6. * Exact DP solution to the 0-1 knapsack problem with integer values given a known
  7. * upper bound V on OPT. Runs in O(nV) time.
  8. *
  9. * @param {Array} v Values.
  10. * @param {Array} w Weights.
  11. * @param {Number} n Size of the problem.
  12. * @param {Number} W Size of the knapsack.
  13. * @param {Number} V Any upper bound on OPT >= 0.
  14. * @param {Array} m Memory buffer.
  15. * @return {Number} Objective value of the optimum.
  16. */
  17. const integerValuesKnapsack = (
  18. v,
  19. w,
  20. n,
  21. W,
  22. V = sum(v),
  23. m = new w.constructor(V + 1).fill(W + 1),
  24. ) => {
  25. assert(v.length === n);
  26. assert(w.length === n);
  27. assert(Number.isInteger(V) && V >= 0);
  28. assert(m.length >= V + 1);
  29. m[V] = 0;
  30. for (let i = 0; i < n; ++i) {
  31. const wi = w[i];
  32. const vi = v[i];
  33. assert(Number.isInteger(vi) && vi >= 0);
  34. const k = V - vi + 1;
  35. for (let j = 0; j < k; ++j) {
  36. m[j] = Math.min(m[j], m[j + vi] + wi);
  37. }
  38. }
  39.  
  40. for (let j = 0; j < V; ++j) {
  41. if (m[j] <= W) return V - j;
  42. }
  43.  
  44. return 0;
  45. };
  46.  
  47. export default integerValuesKnapsack;