Anonymous user
Knapsack problem/Continuous: Difference between revisions
→{{header|Elixir}}: add Alternate Version
m (→{{header|Sidef}}: better indentation) |
(→{{header|Elixir}}: add Alternate Version) |
||
Line 789:
{{trans|Erlang}}
<lang elixir>defmodule KnapsackProblem do
def price_per_weight( items ), do: (for {name, weight, price} <-items, do: {name, weight, price / weight} )▼
def select( max_weight, items ) do
▲
|> elem(1)
|> Enum.reverse
end
def task(
IO.puts "The robber takes the following to maximize the value"
:io.fwrite("~.2f of ~s~n", [weight, name])
end )
end
Line 821 ⟶ 823:
{"sausage", 5.9, 98} ]
KnapsackProblem.task(
{{out}}
<pre>
The robber takes the following to maximize the value
3.50 of welt▼
2.40 of greaves▼
2.50 of brawn▼
3.60 of ham▼
3.00 of salami
▲3.60 of ham
▲2.50 of brawn
▲2.40 of greaves
▲3.50 of welt
</pre>
===Alternate Version===
{{trans|Ruby}}
<lang elixir>defmodule KnapsackProblem do
def continuous(items, max_weight) do
Enum.sort_by(items, fn {_item, {weight, price}} -> -price / weight end)
|> Enum.reduce_while({max_weight,0}, fn {item, {weight, price}}, {rest, value} ->
if rest > weight do
IO.puts "Take all #{item}"
{:cont, {rest - weight, value + price}}
else
:io.format "Take ~.3fkg of ~s~n~n", [rest, item]
:io.format "Total value of swag is ~.2f~n", [value + rest*price/weight]
{:halt, :ok}
end
end)
|> case do
{weight, value} ->
:io.format "Total: weight ~.3fkg, value ~p~n", [max_weight-weight, value]
x -> x
end
end
end
items = [ beef: {3.8, 36},
pork: {5.4, 43},
ham: {3.6, 90},
greaves: {2.4, 45},
flitch: {4.0, 30},
brawn: {2.5, 56},
welt: {3.7, 67},
salami: {3.0, 95},
sausage: {5.9, 98} ]
KnapsackProblem.continuous( items, 15 )</lang>
{{out}}
<pre>
Take all salami
Take all ham
Take all brawn
Take all greaves
Take 3.500kg of welt
Total value of swag is 349.38
</pre>
|