set courses;
param totaldays:= 6;
set days;
param grade {n in courses, i in days};
set states{n in courses}:=
if n=1 then 6
else 6-(n-1)-2 .. 6-(n-1);
set options{n in courses, d in states[n]}:=
if n=4 then d else 1..min( 3, d+n-4 );
param cumulative_grade{n in courses, d in states[n]}:=
if n=4 then grade[n,d] else
max{i in options[n,d]} (grade[n,i]+ cumulative_grade[n+1,d-i]) ;
set opt{n in courses, d in states[n]: n!=4}:=
{ i in options[n,d]:
cumulative_grade[n,d] = grade[n,i]+ cumulative_grade[n+1,d-i] };
data;
set courses:= 1 2 3 4;
set days:= 1 2 3;
param grade:
1 2 3 :=
1 3 5 7
2 4 5 6
3 3 6 7
4 4 7 9 ;