You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何选择无重叠位的bitset得到最多1 求多项式时间解法是否存在

选K个无重叠位bitset的最大1数问题解答

问题描述

给定N个包含M位的bitset,从中选择K个bitset,保证不存在多个bitset在同一位置均为1的情况,求可得到的1的最大数量是多少?

复杂度结论

该问题属于NP难问题,不存在普适的多项式时间复杂度最优解法,除非P=NP。
我们可以将经典NP难问题带基数约束的不相交子集最大化问题直接规约到该问题:

  • 每个bitset对应一个待选子集,bitset中1的位置对应子集包含的元素,bitset中1的数量对应子集的权重
  • 要求选K个互不相交的子集最大化总权重,和原问题完全等价,因此不存在可覆盖所有规模场景的多项式时间最优解法。

可行求解方案

小规模场景最优解法

如果参数规模较小,可以用状态压缩动态规划得到全局最优解:

  • 适用场景:M ≤ 20
  • 状态定义:dp[mask][k]表示选择k个bitset、已占用的位置掩码为mask时,能得到的最大1的数量
  • 转移逻辑:遍历每个bitset,若该bitset的掩码和当前mask无重叠(即mask & bitset_mask == 0),则可以将该bitset加入选择,更新对应的状态值
  • 最终结果:取所有k ≤ K的状态中的最大值即可

如果K或N的规模较小,也可以用回溯+剪枝的方法求解:优先遍历1的数量更多的bitset,提前剪掉不可能超过当前最优解的分支,提升搜索效率。

大规模场景近似解法

如果参数规模较大无法做全局搜索,可以用多项式时间的贪心算法得到近似解:

  • 每次优先选择「1的数量/占用位置数」比值最高、且和已选bitset无冲突的bitset,直到选满K个或者没有符合要求的bitset为止
  • 该方法可以在O(NKM)的时间复杂度内得到近似结果,但无法保证得到全局最优解

示例验证

输入:

N = 5, M = 6
001100
011010
100100
111001
001010

最优解为组合011010和100100,两个bitset没有重叠的1位,总1的数量为3+2=5,符合预期。

内容的提问来源于stack exchange,提问作者Y.T.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 16:48:01