组合问题基础 组合问题通常是给定元素集合,根据条件确定选择子集的条件,一般包含条件:子集的元素个数,然后从中取出符合条件所有组合 我们只需要学会选择所有子集或则固定元素数量的子集,根据别的条件进行筛选,就可以得到我们的所有子集 我们用0,1表示集合中元素的选择与否,那么所有子集即可用二进制表示,最大子集的二进制表示对应的十进制数即为所有子集的数量,例如: 集合[a,b,c],则有0b111种子集,即0d7种子集),分别对应为(001)、(010)、(011)、(100)、(101)、(110)、(111),注意不包括(000),因为(000)对应的子集为空集,即a,b,c都不选,那么选择的元素所有子集为[,c]、[,b,]、[,b,c]、…、[a,b,c],与上面二进制对应 算法实现(python): 首先使用一个int数组表示子集,长度与集合元素数量相等,数组中1表示选择对应的元素,0表示不选择,样例为8个元素选择3个的所有子集 import numpy as np from numpy.core.fromnumeric import size from numpy.ma.core import arange # 元素集合 sample = ["a","b","c","d","e","f","g","h"] # 对应的int数组 book = np.random.randint(0,1,len(sample)) 因为我使用的是int数组表示,所以需要单独实现加减法,也可以直接使用二进制,使用python的int,bin等关键字转化 # 加法,默认加1 # 加一成功返回True,溢出返回False def add(arry,num=1): if arry[0