I'm not sure exactly what you want, but in an effort to demonstrate some possibilities:
Join @@ Table[{{a, b},
NMinimize[{a x + b y, 0.2 x + 0.1 y >= 14, 0.25 x + 0.6 y >= 30, 0.1 x + 0.15 y >= 10,
x >= 0, y >= 0}, {x, y}][[2]]}, {a, 0, 3, 1}, {b, 0, 3, 1}] // Column
Or:
Join @@ Table[{{HoldForm[a] -> a, HoldForm[b] -> b},
NMinimize[{a x + b y, 0.2 x + 0.1 y >= 14, 0.25 x + 0.6 y >= 30, 0.1 x + 0.15 y >= 10,
x >= 0, y >= 0}, {x, y}][[2]]}, {a, 0, 3, 1}, {b, 0, 3, 1}] // MatrixForm
Based on your comment perhaps:
expr =
{a x + b y, 0.2 x + 0.1 y >= 14, 0.25 x + 0.6 y >= 30, 0.1 x + 0.15 y >= 10, x >= 0, y >= 0};
tab =
Table[
{a, b, x, y, #} /. #2 & @@ NMinimize[expr, {x, y}],
{a, 0, 3}, {b, 0, 3}
] ~Flatten~ 1;
TableForm[tab, TableHeadings -> {None, {"a", "b", "x", "y", "value"}}]

If wish to use specific values rather than a range you merely need this syntax for Table
:

For example:
aVals = RandomInteger[{0, 20}, 7]
{3, 9, 4, 5, 18, 13, 3}
expr =
{a x + b y, 0.2 x + 0.1 y >= 14, 0.25 x + 0.6 y >= 30, 0.1 x + 0.15 y >= 10, x >= 0, y >= 0};
tab =
Table[
{a, b, x, y, #} /. #2 & @@ NMinimize[expr, {x, y}],
{a, aVals}, {b, 0, 3}
] ~Flatten~ 1;
TableForm[tab, TableHeadings -> {None, {"a", "b", "x", "y", "value"}}]

Explanation
brama requested an explanation of this code:
I have trouble understanding the role of #2
and ~Flatten~ 1
. Also, How does it transfer the optimal x
and y
values from the NMinimize to the table?
The documentation for NMinimize
states:

The first part is the minimum value found, and the second part is a list of replacement rules.
I used the combination of Function
, Slot
, and Apply
to handle these two parts. An independent example:
{a, b, x, y, #} /. #2 & @@ {"part1", "part2"} // Quiet
{a, b, x, y, "part1"} /. "part2"
(I used Quiet
to suppress the message informing us that "part2"
is not a list of replacement rules.)
With actual output from NMimimize
: {0., {x -> 55., y -> 30.}}
this becomes:
{a, b, x, y, 0.} /. {x -> 55., y -> 30.}
Then after the ReplaceAll
replacements and evaluation of a
and b
within Table
:
{0, 0, 55., 30., 0.}
See this answer for other ways to work with the output of NMinimze
.
The final piece of the code is ~Flatten~ 1
. First: a ~op~ b
is infix notation for op[a, b]
. Flatten
is used to combine expressions with the same head (by default List
) and different levels. Here it is used to combine the lists of solutions for each a
value into a single list of solutions. An independent example:
x1 = Array[Plus, {3, 4, 5}]
{{{3, 4, 5, 6, 7}, {4, 5, 6, 7, 8}, {5, 6, 7, 8, 9}, {6, 7, 8, 9, 10}},
{{4, 5, 6, 7, 8}, {5, 6, 7, 8, 9}, {6, 7, 8, 9, 10}, {7, 8, 9, 10, 11}},
{{5, 6, 7, 8, 9}, {6, 7, 8, 9, 10}, {7, 8, 9, 10, 11}, {8, 9, 10, 11, 12}}}
x1 ~Flatten~ 1
{{3, 4, 5, 6, 7},
{4, 5, 6, 7, 8},
{5, 6, 7, 8, 9},
{6, 7, 8, 9, 10},
{4, 5, 6, 7, 8},
{5,6, 7, 8, 9},
{6, 7, 8, 9, 10},
{7, 8, 9, 10, 11},
{5, 6, 7, 8, 9},
{6, 7, 8, 9, 10},
{7, 8, 9, 10, 11},
{8, 9, 10, 11, 12}}
Table
, then if necessary edit your question with what you tried and in what way it did not work. (I will reopen the question at that time.) $\endgroup$TableForm[ Table[NMinimize[{a x+b y,0.2 x+0.1 y>=14,0.25 x+0.6 y>=30,0.1 x+0.15 y>=10,x>=0,y>=0},{x,y}][[1]],{a,0,2,0.2},{b,0,3,0.3}], TableHeadings->{"a = "<>ToString[#]&/@Range[0,2,0.2],"b = "<>ToString[#]&/@Range[0,3,0.3]}]
? $\endgroup$