2021-02-06 04:42:36 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								---
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								id: 5a23c84252665b21eecc7ed4
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								title: Knapsack problem/Unbounded
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								challengeType: 5
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								forumTopicId: 323655
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								dashedName: knapsack-problemunbounded
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								---
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# --description--
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								A traveler gets diverted and has to make an unscheduled stop in what turns out to be Shangri-La. Opting to leave, he is allowed to take as much as he likes of the items available there, so long as it will fit in his knapsack, and he can carry it.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								He knows that he can carry no more than a particular value of maximum weight in total; and that the capacity of his knapsack has a limited volume.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Looking just above the bar codes on the items he finds their weights and volumes. He digs out his recent copy of a financial paper and gets the value of each item.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								He can only take whole units of any item, but there is much more of any item than he could ever carry.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# --instructions--
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Write a function that takes an array of objects, maximum weight, and maximum volume as parameters. Each object has 4 attributes: name, value, weight, and volume. The function should return the maximum value of items the traveller can take with him.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# --hints--
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								`knapsackUnbounded([{ name:"panacea", value:3000, weight:0.3, volume:0.025 }, { name:"ichor", value:1800, weight:0.2, volume:0.015 }, { name:"gold", value:2500, weight:2, volume:0.002 }], 25, 0.25)`  should return `54500` . 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								assert.equal(
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  knapsackUnbounded(
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    [
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      { name: 'panacea', value: 3000, weight: 0.3, volume: 0.025 },
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      { name: 'ichor', value: 1800, weight: 0.2, volume: 0.015 },
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      { name: 'gold', value: 2500, weight: 2, volume: 0.002 }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ],
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    25,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    0.25
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ),
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  54500
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								`knapsackUnbounded([{ name:"panacea", value:3000, weight:0.3, volume:0.025 }, { name:"ichor", value:1800, weight:0.2, volume:0.015 }, { name:"gold", value:2500, weight:2, volume:0.002 }], 55, 0.25)`  should return `88400` . 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								assert.equal(
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  knapsackUnbounded(
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    [
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      { name: 'panacea', value: 3000, weight: 0.3, volume: 0.025 },
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      { name: 'ichor', value: 1800, weight: 0.2, volume: 0.015 },
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      { name: 'gold', value: 2500, weight: 2, volume: 0.002 }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ],
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    55,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    0.25
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ),
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  88400
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								`knapsackUnbounded([{ name:"panacea", value:3000, weight:0.3, volume:0.025 }, { name:"ichor", value:1800, weight:0.2, volume:0.015 }, { name:"gold", value:2500, weight:2, volume:0.002 }], 25, 0.15)`  should return `42500` . 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								assert.equal(
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  knapsackUnbounded(
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    [
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      { name: 'panacea', value: 3000, weight: 0.3, volume: 0.025 },
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      { name: 'ichor', value: 1800, weight: 0.2, volume: 0.015 },
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      { name: 'gold', value: 2500, weight: 2, volume: 0.002 }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ],
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    25,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    0.15
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ),
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  42500
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-09 21:23:54 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								`knapsackUnbounded([{ name:"panacea", value:3000, weight:0.3, volume:0.025 }, { name:"ichor", value:1800, weight:0.2, volume:0.015 }, { name:"gold", value:2500, weight:2, volume:0.002 }], 35, 0.35)`  should return `75900` . 
						 
					
						
							
								
									
										
										
										
											2021-02-06 04:42:36 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								assert.equal(
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  knapsackUnbounded(
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    [
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      { name: 'panacea', value: 3000, weight: 0.3, volume: 0.025 },
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      { name: 'ichor', value: 1800, weight: 0.2, volume: 0.015 },
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      { name: 'gold', value: 2500, weight: 2, volume: 0.002 }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ],
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    35,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    0.35
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ),
							 
						 
					
						
							
								
									
										
										
										
											2021-07-09 21:23:54 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  75900
							 
						 
					
						
							
								
									
										
										
										
											2021-02-06 04:42:36 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								`knapsackUnbounded([{ name:"panacea", value:3000, weight:0.3, volume:0.025 }, { name:"ichor", value:1800, weight:0.2, volume:0.015 }, { name:"gold", value:2500, weight:2, volume:0.002 }], 15, 0.25)`  should return `43200` . 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								assert.equal(
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  knapsackUnbounded(
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    [
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      { name: 'panacea', value: 3000, weight: 0.3, volume: 0.025 },
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      { name: 'ichor', value: 1800, weight: 0.2, volume: 0.015 },
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      { name: 'gold', value: 2500, weight: 2, volume: 0.002 }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ],
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    15,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    0.25
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ),
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  43200
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# --seed--
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								## --seed-contents--
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								function knapsackUnbounded(items, maxweight, maxvolume) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# --solutions--
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```js
							 
						 
					
						
							
								
									
										
										
										
											2021-07-09 21:23:54 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								function knapsackUnbounded(items, maxWeight, maxVolume) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  function getPickTotals(items, pick) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    let totalValue = 0;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    let totalWeight = 0;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    let totalVolume = 0;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for (let i = 0; i <  items.length ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      totalValue += pick[i] * items[i].value;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      totalWeight += pick[i] * items[i].weight;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      totalVolume += pick[i] * items[i].volume;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return [totalValue, totalWeight, totalVolume];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  function getMaxes(items, maxWeight, maxVolume) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const maxes = [];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for (let i = 0; i <  items.length ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      const maxUnitsInWeight = Math.floor(maxWeight / items[i].weight);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      const maxUnitsInVolume = Math.floor(maxVolume / items[i].volume);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      const maxUnitsInLimit = Math.min(maxUnitsInWeight, maxUnitsInVolume);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      maxes.push(maxUnitsInLimit);
							 
						 
					
						
							
								
									
										
										
										
											2021-02-06 04:42:36 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    }
							 
						 
					
						
							
								
									
										
										
										
											2021-07-09 21:23:54 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return maxes;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  function isInLimit(value, limit) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return value < = limit;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  function getCombinations(maxValues, curPicks, combinations) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if (maxValues.length === 0) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      combinations.push(curPicks);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const curMax = maxValues[0];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const leftMaxValues = maxValues.slice(1);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for (let i = 0; i < = curMax; i++) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      getCombinations(leftMaxValues, curPicks.concat(i), combinations);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return combinations;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  let bestValue = 0;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  let bestPick = [];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  const maxes = getMaxes(items, maxWeight, maxVolume);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  const combinations = getCombinations(maxes, [], []);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  for (let i = 0; i <  combinations.length ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const curPick = combinations[i];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const [curValue, curWeight, curVolume] = getPickTotals(items, curPick);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if (!isInLimit(curWeight, maxWeight) || !isInLimit(curVolume, maxVolume)) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      continue;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if (curValue > bestValue) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      bestValue = curValue;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      bestPick = [curPick];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } else if (curValue === bestValue) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      bestPick.push(curPick);
							 
						 
					
						
							
								
									
										
										
										
											2021-02-06 04:42:36 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-09 21:23:54 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  return bestValue;
							 
						 
					
						
							
								
									
										
										
										
											2021-02-06 04:42:36 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```