1. 按目标向量枚举
枚举目标向量每个分量上的可取值
1)全子集
def dfs(x,t,s,start):
print x[:t]
for i in xrange(start,len(s)):
x[t]=s[i]
dfs(x,t+1,s,i+1)
2)特定大小子集
def dfs(x,t,s,start):
if t==len(x):
print x
else:
for i in xrange(start,len(s)):
x[t]=s[i]
dfs(x,t+1,s, i+1)
2.按候选集合枚举
枚举候选集合每个元素取还是不取,同时填充目标向量
1)全子集
def dfs(s,t,x,i):
if t==len(s):
print x[:i]
else:
x[i]=s[t]
dfs(s,t+1,x,i+1)
dfs(s,t+1,x,i)
2)特定大小子集
def dfs(s,t,x,i):
if i==len(x):
print x
else:
x[i]=s[t]
dfs(s,t+1,x,i+1)
if len(s)-t > len(x)-i:
dfs(s,t+1,x,i)
3.动态规划
第i个元素加入后的子集可以由第i-1个元素加入时的子集生成:f(i) = f(i-1) + for each s in f(i-1) insert A[i-1]
1)全子集
def subset(A):
f = [[]]
for i in xrange(len(A)):
f += [x + [A[i]] for x in f]
return f
2)特定大小子集
def subset(s, k):
f=[[]]*(k+1)
f[0]=[[]]
for i in xrange(1, len(s)+1):
for j in xrange(k, 0,-1):
f[j] = f[j] + [x+[s[i-1]] for x in f[j-1]]
print f[k]