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 ;