defdo_permuations(P):defperm(P,A,cur):if cur==n:print(A);return
item_bef = Nonefor i in range(n):
if P[i]==item_bef:item_bef = P[i];continue
item_bef = P[i]
c1,c2 = 0,0for j in range(cur):
if A[j]==P[i]:c1+=1for j in range(n):
if P[j]==P[i]:c2+=1if c1<c2:
A[cur] = P[i]
perm(P,A,cur+1)
P = sorted(P)
n = len(P)
perm(P,[None]*n,0)
do_permuations([1,1,1,2])
defnext_perm(this_p):
n = len(this_p)
ok=Falsefor i in range(n-1,0,-1):
if this_p[i-1]<this_p[i]:ok=True;breakifnot ok:returnNone
ava = sorted(this_p[i-1:n])
for x in ava:
if x>this_p[i-1]:
ava.remove(x)
this_p[i-1] = x
break
this_p[i:n] = ava
return this_p
利用二进制枚举子集:相对与增量法,不需要进行定序就可以以极高的效率枚举完成。
defprint_subset(array):defdo():for i in range(0, 2**n):
for j in range(n):
#print('aa\n')if i & (1 << j):
print(array[j], end=' ')
print()
n = len(array)
do()
print_subset([1, 2, 'sb'])
defprint_subset(array):defdo():
print()
for i in range(1, 2**n):
ans = []
for j in range(n):
if i & (1 << j):
ans.append(array_2[j])
print(ans)
if each in ans:
for k in range(1, repeat[each] + 1):
if k + ans.count(each) > 1:
print(ans + [each] * (k))
array_2 = list(set(array))
repeat = {}
for each in array:
if each notin repeat:
repeat[each] = 0else:
repeat[each] += 1
n = len(array_2)
do()