27 lines
1.3 KiB
D
27 lines
1.3 KiB
D
void main() {
|
|
import std.stdio, std.algorithm, std.typecons, std.range, std.conv;
|
|
|
|
alias Bounty = Tuple!(int,"value", double,"weight", double,"volume");
|
|
|
|
immutable panacea = Bounty(3000, 0.3, 0.025);
|
|
immutable ichor = Bounty(1800, 0.2, 0.015);
|
|
immutable gold = Bounty(2500, 2.0, 0.002);
|
|
immutable sack = Bounty( 0, 25.0, 0.25);
|
|
|
|
immutable maxPanacea = min(sack.weight / panacea.weight, sack.volume / panacea.volume).to!int;
|
|
immutable maxIchor = min(sack.weight / ichor.weight, sack.volume / ichor.volume).to!int;
|
|
immutable maxGold = min(sack.weight / gold.weight, sack.volume / gold.volume).to!int;
|
|
|
|
immutable best =
|
|
cartesianProduct(maxPanacea.iota, maxIchor.iota, maxGold.iota)
|
|
.map!(t => tuple(Bounty(t[0] * panacea.value + t[1] * ichor.value + t[2] * gold.value,
|
|
t[0] * panacea.weight + t[1] * ichor.weight + t[2] * gold.weight,
|
|
t[0] * panacea.volume + t[1] * ichor.volume + t[2] * gold.volume), t))
|
|
.filter!(t => t[0].weight <= sack.weight && t[0].volume <= sack.volume)
|
|
.reduce!max;
|
|
|
|
writeln("Maximum value achievable is ", best[0].value);
|
|
writefln("This is achieved by carrying (one solution) %d panacea, %d ichor and %d gold", best[1][]);
|
|
writefln("The weight to carry is %4.1f and the volume used is %5.3f", best[0][1..$]);
|
|
}
|