I think there's no generally efficient way to do this, since you can always choose the constraints such that they don't restrict anything, in which case you want to find all possible subset partitions.
That being said, there's almost certainly a better approach than mine, but it works, and solves your example input in a second or so. Let's go:
constraints = {{11, 2}, {11, 3}, {11, 4}, {11, 6}, {11, 9}, {1, 6}, {5, 6}, {2, 5}};
weights = {3, 7, 3, 2, 4, 2, 2, 2, 3, 2, 1};
First we remove some unnecessary constraints (in this case, the last one is unnecessary, because the weights prohibit these two from appearing in the same set anyway):
constraints = Cases[constraints, l_List /; Total@weights[[l]] <= 9];
Now we get a list of all subsets of Range@11
which can potentially appear in the partition. That is, all subsets whose weights sum to a value between 7 and 9, and which don't contain one of the constraint pairs:
parts = Cases[
Subsets@Range@11,
l_List /; 7 <= Total@weights[[l]] <= 9 && NoneTrue[constraints, SubsetQ[l, #] &]
]
Length @ parts (* 107 *)
So we've got 107 potential sublists for the partition. Now we just recursively piece them together into disjoint groups, and Sow
the result whenever it contains all 11 numbers:
f[partition_, parts_] := Module[{newPartition},
If[Length@Flatten@partition == 11,
Sow@partition,
If[parts != {},
newPartition = Append[partition, parts[[1]]];
(* Try adding the first part to the partition, and recursively
call f with all remaining disjoint parts. *)
f[newPartition,
Cases[Rest@parts,
l_List /; Intersection[l, Flatten@newPartition] == {}]];
(* Try the next part instead. *)
f[partition, Rest@parts]
];
]
]
solutions = Reap[f[{}, parts]][[2, 1]];
Length@solutions (* 210 *)
So we find 210 solutions (which contains your example solution, I checked). Now just to verify that all of these are valid:
And @@ ((Sort@Flatten@# == Range[11] &&
AllTrue[#, 7 <= Total[weights[[#]]] <= 9 &] &&
Nor @@ SubsetQ @@@ Tuples[{#, constraints}]) & /@ solutions)
(* True *)