mirror of
https://github.com/freeCodeCamp/freeCodeCamp.git
synced 2026-02-23 17:10:25 -05:00
170 lines
6.6 KiB
Markdown
170 lines
6.6 KiB
Markdown
---
|
|
id: 5a23c84252665b21eecc7ed3
|
|
title: Rucksackproblem/kontinuierlich
|
|
challengeType: 1
|
|
forumTopicId: 323654
|
|
dashedName: knapsack-problemcontinuous
|
|
---
|
|
|
|
# --description--
|
|
|
|
A thief burgles a butcher's shop, where he can select from some items.
|
|
|
|
Der Dieb kennt die Gewichte und Preise der einzelnen Artikel. Da er einen Rucksack hat, der nur ein bestimmtes Gewicht tragen kann, möchte er die Gegenstände so auswählen, dass sein Gewinn maximiert wird. Er kann die Artikel zerschneiden; der Artikel hat nach dem Zerschneiden einen reduzierten Preis, der proportional zum ursprünglichen Preis im Verhältnis der Massen ist. Das bedeutet: Die Hälfte eines Artikels kostet nur die Hälfte des Originals.
|
|
|
|
# --instructions--
|
|
|
|
Schreibe eine Funktion, die ein Array mit Objekten annimmt, die die im Shop verfügbaren Artikel darstellen. Jedes Objekt hat 3 Attribute: Name, Gewicht und Wert. Die Funktion nimmt auch das maximale Gewicht als Parameter an. Die Funktion sollte den höchstmöglichen Wert zurückgeben und das Gesamtgewicht der ausgewählten Artikel sollte das Höchstgewicht nicht überschreiten.
|
|
|
|
# --hints--
|
|
|
|
`knapContinuous([{ "weight":3.8, "value":36, name:"beef" }, { "weight":5.4, "value":43, name:"pork" }, { "weight":3.6, "value":90, name:"ham" }, { "weight":2.4, "value":45, name:"greaves" }, { "weight":4.0, "value":30, name:"flitch" }, { "weight":2.5, "value":56, name:"brawn" }, { "weight":3.7, "value":67, name:"welt" }, { "weight":3.0, "value":95, name:"salami" }, { "weight":5.9, "value":98, name:"sausage" }], 10)` sollte `257.875` zurückgeben.
|
|
|
|
```js
|
|
assert.equal(
|
|
knapContinuous(
|
|
[
|
|
{ weight: 3.8, value: 36, name: 'beef' },
|
|
{ weight: 5.4, value: 43, name: 'pork' },
|
|
{ weight: 3.6, value: 90, name: 'ham' },
|
|
{ weight: 2.4, value: 45, name: 'greaves' },
|
|
{ weight: 4.0, value: 30, name: 'flitch' },
|
|
{ weight: 2.5, value: 56, name: 'brawn' },
|
|
{ weight: 3.7, value: 67, name: 'welt' },
|
|
{ weight: 3.0, value: 95, name: 'salami' },
|
|
{ weight: 5.9, value: 98, name: 'sausage' }
|
|
],
|
|
10
|
|
),
|
|
257.875
|
|
);
|
|
```
|
|
|
|
`knapContinuous([{ "weight":3.8, "value":36, name:"beef" }, { "weight":5.4, "value":43, name:"pork" }, { "weight":3.6, "value":90, name:"ham" }, { "weight":2.4, "value":45, name:"greaves" }, { "weight":4.0, "value":30, name:"flitch" }, { "weight":2.5, "value":56, name:"brawn" }, { "weight":3.7, "value":67, name:"welt" }, { "weight":3.0, "value":95, name:"salami" }, { "weight":5.9, "value":98, name:"sausage" }], 12)` sollte `295.05405405405406` zurückgeben.
|
|
|
|
```js
|
|
assert.equal(
|
|
knapContinuous(
|
|
[
|
|
{ weight: 3.8, value: 36, name: 'beef' },
|
|
{ weight: 5.4, value: 43, name: 'pork' },
|
|
{ weight: 3.6, value: 90, name: 'ham' },
|
|
{ weight: 2.4, value: 45, name: 'greaves' },
|
|
{ weight: 4.0, value: 30, name: 'flitch' },
|
|
{ weight: 2.5, value: 56, name: 'brawn' },
|
|
{ weight: 3.7, value: 67, name: 'welt' },
|
|
{ weight: 3.0, value: 95, name: 'salami' },
|
|
{ weight: 5.9, value: 98, name: 'sausage' }
|
|
],
|
|
12
|
|
),
|
|
295.05405405405406
|
|
);
|
|
```
|
|
|
|
`knapContinuous([{ "weight":3.8, "value":36, name:"beef" }, { "weight":5.4, "value":43, name:"pork" }, { "weight":3.6, "value":90, name:"ham" }, { "weight":2.4, "value":45, name:"greaves" }, { "weight":4.0, "value":30, name:"flitch" }, { "weight":2.5, "value":56, name:"brawn" }, { "weight":3.7, "value":67, name:"welt" }, { "weight":3.0, "value":95, name:"salami" }, { "weight":5.9, "value":98, name:"sausage" }], 15)` sollte `349.3783783783784` zurückgeben.
|
|
|
|
```js
|
|
assert.equal(
|
|
knapContinuous(
|
|
[
|
|
{ weight: 3.8, value: 36, name: 'beef' },
|
|
{ weight: 5.4, value: 43, name: 'pork' },
|
|
{ weight: 3.6, value: 90, name: 'ham' },
|
|
{ weight: 2.4, value: 45, name: 'greaves' },
|
|
{ weight: 4.0, value: 30, name: 'flitch' },
|
|
{ weight: 2.5, value: 56, name: 'brawn' },
|
|
{ weight: 3.7, value: 67, name: 'welt' },
|
|
{ weight: 3.0, value: 95, name: 'salami' },
|
|
{ weight: 5.9, value: 98, name: 'sausage' }
|
|
],
|
|
15
|
|
),
|
|
349.3783783783784
|
|
);
|
|
```
|
|
|
|
`knapContinuous([{ "weight":3.8, "value":36, name:"beef" }, { "weight":5.4, "value":43, name:"pork" }, { "weight":3.6, "value":90, name:"ham" }, { "weight":2.4, "value":45, name:"greaves" }, { "weight":4.0, "value":30, name:"flitch" }, { "weight":2.5, "value":56, name:"brawn" }, { "weight":3.7, "value":67, name:"welt" }, { "weight":3.0, "value":95, name:"salami" }, { "weight":5.9, "value":98, name:"sausage" }], 22)` sollte `459.5263157894737` zurückgeben.
|
|
|
|
```js
|
|
assert.equal(
|
|
knapContinuous(
|
|
[
|
|
{ weight: 3.8, value: 36, name: 'beef' },
|
|
{ weight: 5.4, value: 43, name: 'pork' },
|
|
{ weight: 3.6, value: 90, name: 'ham' },
|
|
{ weight: 2.4, value: 45, name: 'greaves' },
|
|
{ weight: 4.0, value: 30, name: 'flitch' },
|
|
{ weight: 2.5, value: 56, name: 'brawn' },
|
|
{ weight: 3.7, value: 67, name: 'welt' },
|
|
{ weight: 3.0, value: 95, name: 'salami' },
|
|
{ weight: 5.9, value: 98, name: 'sausage' }
|
|
],
|
|
22
|
|
),
|
|
459.5263157894737
|
|
);
|
|
```
|
|
|
|
`knapContinuous([{ "weight":3.8, "value":36, name:"beef" }, { "weight":5.4, "value":43, name:"pork" }, { "weight":3.6, "value":90, name:"ham" }, { "weight":2.4, "value":45, name:"greaves" }, { "weight":4.0, "value":30, name:"flitch" }, { "weight":2.5, "value":56, name:"brawn" }, { "weight":3.7, "value":67, name:"welt" }, { "weight":3.0, "value":95, name:"salami" }, { "weight":5.9, "value":98, name:"sausage" }], 24)` sollte `478.4736842105263` zurückgeben.
|
|
|
|
```js
|
|
assert.equal(
|
|
knapContinuous(
|
|
[
|
|
{ weight: 3.8, value: 36, name: 'beef' },
|
|
{ weight: 5.4, value: 43, name: 'pork' },
|
|
{ weight: 3.6, value: 90, name: 'ham' },
|
|
{ weight: 2.4, value: 45, name: 'greaves' },
|
|
{ weight: 4.0, value: 30, name: 'flitch' },
|
|
{ weight: 2.5, value: 56, name: 'brawn' },
|
|
{ weight: 3.7, value: 67, name: 'welt' },
|
|
{ weight: 3.0, value: 95, name: 'salami' },
|
|
{ weight: 5.9, value: 98, name: 'sausage' }
|
|
],
|
|
24
|
|
),
|
|
478.4736842105263
|
|
);
|
|
```
|
|
|
|
# --seed--
|
|
|
|
## --seed-contents--
|
|
|
|
```js
|
|
function knapContinuous(items, maxweight) {
|
|
|
|
}
|
|
```
|
|
|
|
# --solutions--
|
|
|
|
```js
|
|
function knapContinuous(items, maxweight) {
|
|
function item_cmp(a, b) {
|
|
const ua = a.unitVal,
|
|
ub = b.unitVal;
|
|
return ua < ub ? 1 : ua > ub ? -1 : 0;
|
|
}
|
|
items = items.map(({ value, weight }) => ({
|
|
unitVal: value / weight,
|
|
weight
|
|
}));
|
|
items.sort(item_cmp);
|
|
|
|
let val = 0;
|
|
let wt = 0;
|
|
for (let { unitVal, weight } of items) {
|
|
var portion = Math.min(maxweight - wt, weight);
|
|
wt += portion;
|
|
var addVal = portion * unitVal;
|
|
val += addVal;
|
|
if (wt >= maxweight) {
|
|
break;
|
|
}
|
|
}
|
|
return val;
|
|
}
|
|
```
|