python编程:不同的物品,分给不同的人,每人至少一个,求输出方案和统计

例如,将abcdefg,分给甲乙丙三人,每人至少一个,有多少种方案,分别列举出来。

这种排列组合就行了,利用itertools库中的combinations方法进行排列组合,思路如下。

import itertools

set_all=set('abcdefg')
count=0

#共有7个元素,循环7次
for i in range(1,8):
    #第一个人
    for L1 in itertools.combinations(set_all, i):
        #第一个人分配后剩余的
        rem=set_all-set(L1)
        #对剩余的进行循环
        for j in range(1,7-i):
            #第二个人
            for L2 in itertools.combinations(rem, j):
                #剩下的是第三个人的
                L3=rem-set(L2)
                count+=1
                print(count,end=' ')
                #输出分配方案
                print("甲:{},乙:{},丙:{}".format(set(L1),set(L2),L3))

输出:
1 甲:{'b'},乙:{'c'},丙:{'a', 'g', 'd', 'f', 'e'}
2 甲:{'b'},乙:{'a'},丙:{'c', 'g', 'd', 'f', 'e'}
3 甲:{'b'},乙:{'g'},丙:{'c', 'a', 'd', 'f', 'e'}
4 甲:{'b'},乙:{'d'},丙:{'c', 'a', 'g', 'f', 'e'}
5 甲:{'b'},乙:{'f'},丙:{'c', 'a', 'g', 'd', 'e'}
6 甲:{'b'},乙:{'e'},丙:{'c', 'a', 'g', 'd', 'f'}
7 甲:{'b'},乙:{'a', 'c'},丙:{'d', 'e', 'g', 'f'}
8 甲:{'b'},乙:{'g', 'c'},丙:{'d', 'e', 'a', 'f'}
9 甲:{'b'},乙:{'d', 'c'},丙:{'e', 'a', 'g', 'f'}
10 甲:{'b'},乙:{'f', 'c'},丙:{'d', 'a', 'g', 'e'}
11 甲:{'b'},乙:{'e', 'c'},丙:{'d', 'a', 'g', 'f'}
12 甲:{'b'},乙:{'a', 'g'},丙:{'d', 'f', 'e', 'c'}
13 甲:{'b'},乙:{'d', 'a'},丙:{'f', 'g', 'e', 'c'}
14 甲:{'b'},乙:{'a', 'f'},丙:{'d', 'e', 'g', 'c'}
15 甲:{'b'},乙:{'a', 'e'},丙:{'d', 'f', 'g', 'c'}
16 甲:{'b'},乙:{'d', 'g'},丙:{'f', 'a', 'e', 'c'}
17 甲:{'b'},乙:{'g', 'f'},丙:{'d', 'e', 'a', 'c'}
18 甲:{'b'},乙:{'g', 'e'},丙:{'d', 'f', 'a', 'c'}
19 甲:{'b'},乙:{'d', 'f'},丙:{'e', 'a', 'g', 'c'}
20 甲:{'b'},乙:{'d', 'e'},丙:{'f', 'a', 'g', 'c'}
......
共有1806种组合。