go => items(Items), weights(Weights), values(Values), knapsack_max_weight(MaxWeight), knapsack(Weights,Values,MaxWeight, X,TotalWeight,TotalValue), nl, printf("Total weight: %0.2f Total value: %0.2f\n", TotalWeight,TotalValue), foreach(I in 1..Items.len) if X[I] > 0.0 then printf("%-8w: ",Items[I]), if X[I] == Weights[I] then printf("%0.2f (%w)", Weights[I], all) else printf("%-0.2f",X[I]) end, nl end end, nl. knapsack(Weights,Values,MaxWeight, X,TotalWeight,TotalValue) => N = Weights.len, X = new_list(N), X :: 0.0..max(Weights), TotalWeight #= sum(X), TotalWeight #<= MaxWeight, foreach(I in 1..N) X[I] #<= Weights[I] end, WeightsInv = [1/Weights[I] : I in 1..N], TotalValue #= sum([X[I]*Values[I]*WeightsInv[I] : I in 1..N]), Vars = X ++ [TotalWeight], solve($[glpk,max(TotalValue)],Vars). % data knapsack_max_weight(15.0). items([beef,pork,ham,greaves,flitch,brawn,welt,salami,sausage]). weights([3.8,5.4,3.6,2.4,4.0,2.5,3.7,3.0,5.9]). values([36,43,90,45,30,56,67,95,98]).