52 lines
2.3 KiB
Plaintext
52 lines
2.3 KiB
Plaintext
$ include "seed7_05.s7i";
|
|
include "float.s7i";
|
|
|
|
const type: bounty is new struct
|
|
var integer: value is 0;
|
|
var float: weight is 0.0;
|
|
var float: volume is 0.0;
|
|
end struct;
|
|
|
|
const func bounty: bounty (in integer: value, in float: weight, in float: volume) is func
|
|
result
|
|
var bounty: bountyVal is bounty.value;
|
|
begin
|
|
bountyVal.value := value;
|
|
bountyVal.weight := weight;
|
|
bountyVal.volume := volume;
|
|
end func;
|
|
|
|
const proc: main is func
|
|
local
|
|
const bounty: panacea is bounty(3000, 0.3, 0.025);
|
|
const bounty: ichor is bounty(1800, 0.2, 0.015);
|
|
const bounty: gold is bounty(2500, 2.0, 0.002);
|
|
const bounty: sack is bounty(0, 25.0, 0.25);
|
|
const integer: maxPanacea is trunc(min(sack.weight / panacea.weight, sack.volume / panacea.volume));
|
|
const integer: maxIchor is trunc(min(sack.weight / ichor.weight, sack.volume / ichor.volume));
|
|
const integer: maxGold is trunc(min(sack.weight / gold.weight, sack.volume / gold.volume));
|
|
var bounty: current is bounty.value;
|
|
var bounty: best is bounty.value;
|
|
var array integer: bestAmounts is 3 times 0;
|
|
var integer: numPanacea is 0;
|
|
var integer: numIchor is 0;
|
|
var integer: numGold is 0;
|
|
begin
|
|
for numPanacea range 0 to maxPanacea do
|
|
for numIchor range 0 to maxIchor do
|
|
for numGold range 0 to maxGold do
|
|
current.value := numGold * gold.value + numIchor * ichor.value + numPanacea * panacea.value;
|
|
current.weight := flt(numGold) * gold.weight + flt(numIchor) * ichor.weight + flt(numPanacea) * panacea.weight;
|
|
current.volume := flt(numGold) * gold.volume + flt(numIchor) * ichor.volume + flt(numPanacea) * panacea.volume;
|
|
if current.value > best.value and current.weight <= sack.weight and current.volume <= sack.volume then
|
|
best := current;
|
|
bestAmounts := [] (numPanacea, numIchor, numGold);
|
|
end if;
|
|
end for;
|
|
end for;
|
|
end for;
|
|
writeln("Maximum value achievable is " <& best.value);
|
|
writeln("This is achieved by carrying " <& bestAmounts[1] <& " panacea, " <& bestAmounts[2] <& " ichor and " <& bestAmounts[3] <& " gold items");
|
|
writeln("The weight of this carry is " <& best.weight <& " and the volume used is " <& best.volume digits 4);
|
|
end func;
|