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
// Reverse sorted by Value per amount.
const items = raw.sort!q{a.valuePerKG > b.valuePerKG}().release();
const items = raw.sort!q{a.valuePerKG > b.valuePerKG}.release;


const(Item)[] chosen;
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);
writeln(Item("TOTAL", sum!"amount"(chosen), sum!"value"(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>import std.stdio, std.algorithm;
<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)]
sort!q{a.price/a.weight > b.price/b.weight}(items);
.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}}