RosettaCodeData/Task/Knapsack-problem-Unbounded/Seed7/knapsack-problem-unbounded....

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;