set PEOPLE;
set PROJECTS;
param supply {PEOPLE} >= 0; # hours each person is available
param demand {PROJECTS} >= 0; # hours each project requires
check: sum {i in PEOPLE} supply[i]
= sum {j in PROJECTS} demand[j];
param cost {PEOPLE,PROJECTS} >= 0; # cost per hour of work
param limit {PEOPLE,PROJECTS} >= 0; # maximum contributions
# to projects
var M;
var Assign {i in PEOPLE, j in PROJECTS} >= 0, <= limit[i,j];
minimize max_cost: M;
subject to M_def {i in PEOPLE}:
M >= sum {j in PROJECTS} cost[i,j] * Assign[i,j];
subject to Supply {i in PEOPLE}:
sum {j in PROJECTS} Assign[i,j] = supply[i];
subject to Demand {j in PROJECTS}:
sum {i in PEOPLE} Assign[i,j] = demand[j];