﻿Knap := plan {
  param Items := [
    { Id: 0, V:  20, W:  3 },
    { Id: 1, V:  80, W:  5 },
    { Id: 2, V:  71, W:  8 },
    { Id: 3, V:  60, W: 10 },
    { Id: 4, V:  90, W: 12 },
    { Id: 5, V:  80, W: 13 },
  ];
  param MaxWeight := 19;
  param MinNumber := 0;
  param MaxNumber := 1000;

  var Use from Items;

  msr Weight := Sum(Use, W);
  msr Value  := Sum(Use, V);
  msr Number := Count(Use);

  con ConWeight := Weight <= MaxWeight;
  con ConNumber := MinNumber <= Number <= MaxNumber;
};

"*** Maximize Value ***";
Knap->Maximize(Value);

"*** Maximize Value with MaxNumber: 2 ***";
Knap=>{ MaxNumber: 2 }->Maximize(Value);

"*** Bits from Knap ***";
Bits := Knap with { Items: Range(10)->{ Id: it, V: 1 shl it, W: 1 shl it }, };

Bits=>{ MaxWeight: 21 }->Maximize(Value);

// REVIEW: We could use some syntax like:
// plan X as Knap append { param MaxValue := 1000; con ConValue := Value <= MaxValue; };
