基础算法:组合问题

组合问题基础

  • 组合问题通常是给定元素集合,根据条件确定选择子集的条件,一般包含条件:子集的元素个数,然后从中取出符合条件所有组合
  • 我们只需要学会选择所有子集或则固定元素数量的子集,根据别的条件进行筛选,就可以得到我们的所有子集
  • 我们用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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值