2016 Update
This commit is contained in:
parent
948b86eafa
commit
dcf5d15da3
7965 changed files with 139854 additions and 31002 deletions
|
|
@ -1,14 +1,16 @@
|
|||
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
|
||||
{_remains, selected_items} = List.foldr( List.keysort(items, 2), {max_weight, []}, &select_until/2 )
|
||||
selected_items
|
||||
Enum.sort_by( items, fn {_name, weight, price} -> - price / weight end )
|
||||
|> Enum.reduce( {max_weight, []}, &select_until/2 )
|
||||
|> elem(1)
|
||||
|> Enum.reverse
|
||||
end
|
||||
|
||||
def task( max_weight, items ) do
|
||||
def task( items, max_weight ) do
|
||||
IO.puts "The robber takes the following to maximize the value"
|
||||
for {name, weight} <- select( max_weight, price_per_weight(items) ), do: :io.fwrite("~.2f of ~s~n", [weight, name])
|
||||
Enum.each( select( max_weight, items ), fn {name, weight} ->
|
||||
:io.fwrite("~.2f of ~s~n", [weight, name])
|
||||
end )
|
||||
end
|
||||
|
||||
defp select_until( {name, weight, _price}, {remains, acc} ) when remains > 0 do
|
||||
|
|
@ -31,4 +33,4 @@ items = [ {"beef", 3.8, 36},
|
|||
{"salami", 3.0, 95},
|
||||
{"sausage", 5.9, 98} ]
|
||||
|
||||
KnapsackProblem.task( 15, items )
|
||||
KnapsackProblem.task( items, 15 )
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
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 )
|
||||
Loading…
Add table
Add a link
Reference in a new issue