本题在 n≤25 的规模下求固定大小 k 的最大权独立集,并输出所有最优解,适合状压枚举:
conflict_mask[i] 记录与策略 i+1 互斥的策略集合(conflicts 为 1 下标)。mask ∈ [0, 2^n),用 popcount(mask) == k 筛出大小为 k 的组合。mask 中每个置位 i,检查 conflict_mask[i] & mask 是否为 0;非 0 表示选中了互斥对。mask 递增枚举,内层编号自然升序,组合字典序与枚举顺序一致。mask,返回 []。在云服务中,有 n 个安全策略,编号 1 到 n。每个策略有一个重要度权重(正整数)。某些策略对之间互斥,不能同时启用。
现在需要为某个实例恰好选择 k 个策略,要求:
请返回所有满足上述条件的最优策略组合(即权重和最大的所有合法组合)。
输入
4,2,[5,1,3,4],[[1,2],[2,3]]
输出
[[1,4]]
说明
所有大小为 2 的策略组合及互斥检查:
| 组合 | 是否互斥 | 权重和 |
|---|---|---|
| [1,2] | 是 (1-2冲突) | 非法 |
| [1,3] | 否 | 5+3=8 |
| [1,4] | 5+4=9 | |
| [2,3] | 是 (2-3冲突) | 非法 |
| [2,4] | 否 | 1+4=5 |
| [3,4] | 3+4=7 |
其中权重和最大为 9,对应组合 [1,4],故输出 [[1,4]]。
输入
5,3,[3,4,3,4,3],[[1,3],[2,4],[3,5]]
输出
[[1,2,5],[1,4,5]]
说明
所有大小为3且无互斥的组合:
| 组合 | 互斥检查 | 权重和 |
|---|---|---|
| [1,2,5] | 无冲突 | 3+4+3=10 |
| [1,4,5] | ||
| [1,2,3] | (1,3)冲突 | 非法 |
| [1,2,4] | (2,4)冲突 | |
| [1,3,4] | (1,3)冲突 | |
| [1,3,5] | (1,3)、(3,5)冲突 | |
| [2,3,4] | (2,4)冲突 | |
| [2,3,5] | (3,5)冲突 | |
| [2,4,5] | (2,4)冲突 | |
| [3,4,5] | (3,5)冲突 |
合法组合只有 [1,2,5] 和 [1,4,5],权重和均为 10,是最大值。
按字典序排序:[1,2,5]<[1,4,5],故输出 [[1,2,5],[1,4,5]]。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.