Knapsack problem/Continuous: Difference between revisions

Content added Content deleted
No edit summary
(jq)
Line 1,312: Line 1,312:
3,5 kg welt (value = 63,378)</pre>
3,5 kg welt (value = 63,378)</pre>


=={{header|jq}}==
{{ works with|jq|1.4}}

<lang jq># continuous_knapsack(W) expects the input to be
# an array of objects {"name": _, "weight": _, "value": _}
# where "value" is the value of the given weight of the object.

def continuous_knapsack(W):
map( .price = (if .weight > 0 then (.value/.weight) else 0 end) )
| sort_by( .price )
| reverse
| reduce .[] as $item
# state: [array, capacity]
([[], W];
.[1] as $c
| if $c <= 0 then .
else ( [$item.weight, $c] | min) as $min
| [.[0] + [ $item | (.weight = $min) | .value = (.price * $min)],
($c - $min) ]
end)
| .[1] as $remainder
| .[0]
| (.[] | {name, weight}),
"Total value: \( map(.value) | add)",
"Total weight: \(W - $remainder)" ;</lang>
'''The task:'''
<lang jq>def items: [
{ "name": "beef", "weight": 3.8, "value": 36},
{ "name": "pork", "weight": 5.4, "value": 43},
{ "name": "ham", "weight": 3.6, "value": 90},
{ "name": "greaves", "weight": 2.4, "value": 45},
{ "name": "flitch", "weight": 4.0, "value": 30},
{ "name": "brawn", "weight": 2.5, "value": 56},
{ "name": "welt", "weight": 3.7, "value": 67},
{ "name": "salami", "weight": 3.0, "value": 95},
{ "name": "sausage", "weight": 5.9, "value": 98} ];

items | continuous_knapsack(15)</lang>
{{out}}
<lang sh>$ jq -r -c -n -f knapsack_continuous.jq
{"name":"salami","weight":3}
{"name":"ham","weight":3.6}
{"name":"brawn","weight":2.5}
{"name":"greaves","weight":2.4}
{"name":"welt","weight":3.5000000000000004}
Total value: 349.3783783783784
Total weight: 15</lang>
=={{header|Mathematica}}==
=={{header|Mathematica}}==


Line 1,341: Line 1,388:
Total 15. 349.378
Total 15. 349.378
</lang>
</lang>

=={{header|Mathprog}}==
=={{header|Mathprog}}==
<lang>/*Knapsack
<lang>/*Knapsack