Knapsack problem/Continuous: Difference between revisions
Content added Content deleted
(added →{{header|Racket}}: implementation) |
(Updated both D entries) |
||
Line 369: | Line 369: | ||
{"sausage", 5.9, 98.0}]; |
{"sausage", 5.9, 98.0}]; |
||
// |
// Reverse sorted by Value per amount. |
||
const items = raw.sort!q{a.valuePerKG > b.valuePerKG} |
const items = raw.sort!q{a.valuePerKG > b.valuePerKG}.release; |
||
immutable(Item)[] chosen; |
|||
real space = 15.0; |
real space = 15.0; |
||
foreach (item; items) |
foreach (item; items) |
||
Line 385: | Line 385: | ||
writefln("%10s %7s %7s %7s", "ITEM", "AMOUNT", "VALUE", "$/unit"); |
writefln("%10s %7s %7s %7s", "ITEM", "AMOUNT", "VALUE", "$/unit"); |
||
writefln("%(%s\n%)", chosen); |
writefln("%(%s\n%)", chosen); |
||
Item("TOTAL", chosen.sum!"amount", chosen.sum!"value").writeln; |
|||
}</lang> |
}</lang> |
||
{{out}} |
{{out}} |
||
Line 395: | Line 395: | ||
welt 3.50 63.38 18.11 |
welt 3.50 63.38 18.11 |
||
TOTAL 15.00 349.38 23.29</pre> |
TOTAL 15.00 349.38 23.29</pre> |
||
===Alternative Version=== |
===Alternative Version=== |
||
<lang d> |
<lang d>void main() { |
||
import std.stdio, std.algorithm; |
|||
void main() { |
|||
static struct T { string item; double weight, price; } |
static struct T { string item; double weight, price; } |
||
auto items = [T("beef", 3.8, 36.0), |
auto items = [T("beef", 3.8, 36.0), |
||
T("pork", 5.4, 43.0), |
T("pork", 5.4, 43.0), |
||
Line 408: | Line 410: | ||
T("welt", 3.7, 67.0), |
T("welt", 3.7, 67.0), |
||
T("salami", 3.0, 95.0), |
T("salami", 3.0, 95.0), |
||
T("sausage", 5.9, 98.0)] |
T("sausage", 5.9, 98.0)] |
||
.schwartzSort!q{ -a.price / a.weight }; |
|||
auto left = 15.0; |
auto left = 15.0; |
||
foreach (it; items) |
foreach (it; items) |
||
if (it.weight <= left) { |
if (it.weight <= left) { |
||
writeln("Take all the ", it.item); |
writeln("Take all the ", it.item); |
||
Line 418: | Line 420: | ||
return; |
return; |
||
left -= it.weight; |
left -= it.weight; |
||
} else |
} else |
||
writefln("Take %.1fkg %s", left, it.item); |
return writefln("Take %.1fkg %s", left, it.item); |
||
return; |
|||
} |
|||
} |
|||
}</lang> |
}</lang> |
||
{{out}} |
{{out}} |