param start; # first year of demand param end; # last year of demand param demand {n in start..end}; param invLimit; param prodLimit; param unitCost {n in start..end}; param setupCost; param cost{n in start..end, i in 0..prodLimit}:= if i=0 then 0 else (setupCost + i * unitCost[n]); # cost of producing i units in period n set options{n in start..end, s in 0..invLimit}:= {i in 0..prodLimit: i+s >= demand[n] and i+s-demand[n] <= invLimit}; # set of allowed production levels param f{n in start..end+1, s in 0..invLimit}:= if n = end + 1 then 0 else min{i in options[n,s]} (cost[n,i] + f[n+1, s+i-demand[n]]); set opt{n in start..end, s in 0..invLimit}:= { i in options[n,s]: f[n,s] = cost[n,i] + f[n+1, s+i-demand[n]] }; data; param start:= 1; param end:= 3; param demand:= 1 1 2 2 3 1; param invLimit:= 2; param prodLimit:= 3; param unitCost:= 1 3 2 5 3 4; param setupCost:= 10;