-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
87 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
Para no cansar a los renos, Papá Noel quiere dejar el máximo número de regalos haciendo el menor número posible de viajes. | ||
|
||
Tiene un array de ciudades donde cada elemento es el número de regalos que puede dejar allí. ``[12, 3, 11, 5, 7]``. Por otro lado, el límite de regalos que caben en su saco. Y, finalmente, el número de ciudades máximo que sus renos pueden visitar. | ||
|
||
Como no quiere dejar una ciudad a medias, **si no puede dejar todos los regalos que son de esa ciudad, no deja ninguno allí**. | ||
|
||
Crea un programa que le diga **la suma más alta de regalos** que podría repartir teniendo en cuenta el máximo de regalos que puede transportar y el número máximo de ciudades que puede visitar: | ||
|
||
|
||
```javascript | ||
const giftsCities = [12, 3, 11, 5, 7] | ||
const maxGifts = 20 | ||
const maxCities = 3 | ||
|
||
// la suma más alta de regalos a repartir | ||
// visitando un máximo de 3 ciudades | ||
// es de 20: [12, 3, 5] | ||
|
||
// la suma más alta sería [12, 7, 11] | ||
// pero excede el límite de 20 regalos y tendría | ||
// que dejar alguna ciudad a medias. | ||
|
||
getMaxGifts(giftsCities, maxGifts, maxCities) // 20 | ||
``` | ||
|
||
Si no se puede realizar ningún viaje que satisface los requerimientos, el resultado debe ser ``0``. Más ejemplos: | ||
```javascript | ||
getMaxGifts([12, 3, 11, 5, 7], 20, 3) // 20 | ||
getMaxGifts([50], 15, 1) // 0 | ||
getMaxGifts([50], 100, 1) // 50 | ||
getMaxGifts([50, 70], 100, 1) // 70 | ||
getMaxGifts([50, 70, 30], 100, 2) // 100 | ||
getMaxGifts([50, 70, 30], 100, 3) // 100 | ||
getMaxGifts([50, 70, 30], 100, 4) // 100 | ||
``` | ||
|
||
A tener en cuenta: | ||
|
||
* maxGifts >= 1 | ||
* giftsCities.length >= 1 | ||
* maxCities >= 1 | ||
* El número de maxCities puede ser mayor a giftsCities.length |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
function getMaxGifts(giftsCities, maxGifts, maxCities) { | ||
/* | ||
* Calculate all combinations | ||
* Filter all combinations less than or equal to maxCities | ||
* Obtain all combinations sum | ||
* Filter sums less than or equal to maxGifts | ||
* Sort sums array descending | ||
* Get first value or 0 | ||
*/ | ||
|
||
const getAllCombinations = () => { | ||
let combinations = []; | ||
for (let i = 1; i < (1 << giftsCities.length); i++) { | ||
let innerCombinations = []; | ||
|
||
giftsCities.forEach((_, j) => { | ||
if ((i & (1 << j))) { | ||
innerCombinations.push(giftsCities[j]); | ||
} | ||
}); | ||
combinations.push(innerCombinations) | ||
} | ||
|
||
return combinations; | ||
} | ||
|
||
const result = getAllCombinations() | ||
.filter(({ length }) => length <= maxCities) | ||
.map(arr => arr.reduce((acc, element) => acc + element)) | ||
.filter(x => x <= maxGifts) | ||
.sort((a, b) => b - a); | ||
|
||
|
||
return result.length ? result[0] : 0; | ||
} | ||
|
||
|
||
|
||
console.log('Expected:', 20, 'Actual:', getMaxGifts([12, 3, 11, 5, 7], 20, 3)); | ||
console.log('Expected:', 0, 'Actual:', getMaxGifts([50], 15, 1)); | ||
console.log('Expected:', 50, 'Actual:', getMaxGifts([50], 100, 1)); | ||
console.log('Expected:', 70, 'Actual:', getMaxGifts([50, 70], 100, 1)); | ||
console.log('Expected:', 100, 'Actual:', getMaxGifts([50, 70, 30], 100, 2)); | ||
console.log('Expected:', 100, 'Actual:', getMaxGifts([50, 70, 30], 100, 3)); | ||
console.log('Expected:', 100, 'Actual:', getMaxGifts([50, 70, 30], 100, 4)); |