So it becomes an integer linear program. I suspect the linear relaxation is always optimal since it looks like the type of problem for which that will hold, but I am not certain after a brief look. Anyway, can be done as below. Note that all I changed from my last version is the constraints.
as = {3, 1, 4, 5, 5, 8};
an = {100, 50, 100, 150, 50, 100};
ans = {a1, a2, a3, a4, a5, a6};
bs = {3, 5, 1, 6, 8, 5, 5, 10};
bn = {100, 200, 150, 50, 150, 200, 50, 150};
bns = {b1, b2, b3, b4, b5, b6, b7, b8};
vars = Join[ans, bns];
constraints =
Flatten[{Total[ans] == 1, Total[bns] == 2, ans.an + bns.bn <= 400,
Map[0 <= # <= 1 &, vars]}];
NMaximize[{ans.as + bns.bs, constraints}, vars]
(* Out[69]= {26., {a1 -> 0., a2 -> 0., a3 -> 0., a4 -> 0., a5 -> 0.,
a6 -> 1., b1 -> 0., b2 -> 0., b3 -> 0., b4 -> 0., b5 -> 1.,
b6 -> 0., b7 -> 0., b8 -> 1.}} *)