RosettaCodeData/Task/Knapsack-problem-0-1/XPL0/knapsack-problem-0-1.xpl0
Ingy döt Net d066446780 langs a-z
2013-04-10 22:43:41 -07:00

57 lines
2.2 KiB
Text

include c:\cxpl\codes; \include 'code' declarations
int Item, Items, Weights, Values,
BestItems, BestValues,
I, W, V, N;
def Tab=9;
def Name, Weight, Value;
[Item:= [["map ", 9, 150],
["compass ", 13, 35],
["water ", 153, 200],
["sandwich ", 50, 160],
["glucose ", 15, 60],
["tin ", 68, 45],
["banana ", 27, 60],
["apple ", 39, 40],
["cheese ", 23, 30],
["beer ", 52, 10],
["suntan cream ", 11, 70],
["camera ", 32, 30],
["T-shirt ", 24, 15],
["trousers ", 48, 10],
["umbrella ", 73, 40],
["waterproof trousers ", 42, 70],
["waterproof overclothes", 43, 75],
["note-case ", 22, 80],
["sunglasses ", 7, 20],
["towel ", 18, 12],
["socks ", 4, 50],
["book ", 30, 10]];
BestValues:= 0;
for Items:= 0 to 1<<22-1 do \for all possible combinations of Items...
[I:= Items; W:= 0; V:= 0; N:= 0;
while I do \add weights and values for each item (bit in I)
[if I&1 then
[W:= W + Item(N,Weight); V:= V + Item(N,Value)];
I:= I>>1; N:= N+1;
];
if V>BestValues & W<=400 then \save best combination found so far
[BestValues:= V; BestItems:= Items];
];
I:= BestItems; W:= 0; V:= 0; N:= 0; \show best combination of items
while I do
[if I&1 then
[Text(0, " "); Text(0, Item(N,Name)); ChOut(0, Tab);
IntOut(0, Item(N,Weight)); ChOut(0, Tab);
IntOut(0, Item(N,Value)); CrLf(0);
W:= W + Item(N,Weight);
V:= V + Item(N,Value);
];
I:= I>>1; N:= N+1;
];
Text(0, "Totals: ");
IntOut(0, W); ChOut(0, Tab);
IntOut(0, V); CrLf(0);
]