Jump to content

Knapsack problem/Continuous: Difference between revisions

m (→‎{{header|Perl 6}}: used gather statement)
Line 238:
 
</lang>
=={{header|D}}==
<lang d>import std.stdio, std.algorithm, std.string ;
 
struct Item {
string name ;
real amount, value ;
real valuePerKG() @property { return value/amount ; }
int opCmp(Item rhs) {
auto diff = valuePerKG - rhs.valuePerKG ;
return (diff == 0) ? 0 : (diff > 0) ? 1 : -1 ;
}
string toString() {
return format("%10s %7.2f %7.2f %7.2f",
name, amount, value, valuePerKG) ;
}
}
 
real sum(string Field)(Item[] itms) {
return reduce!("a + b")(0.0L, map!("a." ~ Field )(itms)) ;
}
 
void main() {
Item[] items =
[{"beef", 3.8, 36.0},
{"pork", 5.4, 43.0},
{"ham", 3.6, 90.0},
{"greaves", 2.4, 45.0},
{"flitch", 4.0, 30.0},
{"brawn", 2.5, 56.0},
{"welt", 3.7, 67.0},
{"salami", 3.0, 95.0},
{"sausage", 5.9, 98.0}] ;
 
sort!"a > b"(items) ; // reverse sorted by Value per amount
 
Item[] selects ;
 
real space = 15 ;
 
foreach(itm;items)
if( itm.amount < space) {
selects ~= itm ;
space -= itm.amount ;
} else {
selects ~= Item(itm.name, space, itm.valuePerKG*space) ;
break ;
}
writefln("%10s %7s %7s", "ITEM", "PORTION", "VALUE") ;
foreach(itm; selects)
writeln(itm) ;
writefln("Total weight : %7.2f", sum!"amount"(selects)) ;
writefln("Total value : %7.2f", sum!"value"(selects)) ;
}</lang>
output:
<pre> ITEM PORTION VALUE
salami 3.00 95.00 31.67
ham 3.60 90.00 25.00
brawn 2.50 56.00 22.40
greaves 2.40 45.00 18.75
welt 3.50 63.38 18.11
Total weight : 15.00
Total value : 349.38</pre>
=={{header|Fortran}}==
{{works with|Fortran|90 and later}}
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.