Here's one approach that uses the MILP solver in PROC OPTMODEL:
proc optmodel;
/* declare parameters and read data */
set OBJECTS;
str group {OBJECTS};
read data have1 into OBJECTS=[object] group;
set <str,num> GROUP_PLACE;
num n {GROUP_PLACE};
read data have2 into GROUP_PLACE=[group place] n;
set OBJECT_GROUP_PLACE = {o in OBJECTS, <g,p> in GROUP_PLACE: group[o] = g};
/* X[o,g,p] = 1 if object o is assigned to group g and place p; 0 otherwise */
var X {OBJECT_GROUP_PLACE} binary;
/* assign each object to exactly one group-place */
con AssignOnce {o in OBJECTS}:
sum {<(o),g,p> in OBJECT_GROUP_PLACE} X[o,g,p] = 1;
/* assign correct number of objects to each group-place */
con Cardinality {<g,p> in GROUP_PLACE}:
sum {<o,(g),(p)> in OBJECT_GROUP_PLACE} X[o,g,p] = n[g,p];
/* call MILP solver with no objective */
solve noobj;
/* create output data set */
create data want from [object group place]={<o,g,p> in OBJECT_GROUP_PLACE: X[o,g,p].sol > 0.5};
quit;
If you had some measure of desirability of placing object o in group g and place p, you could instead maximize the total desirability rather than assigning arbitrarily.