#S1001. Sanhai 的求调

Sanhai 的求调


题目背景

sanhai 最近在赶一个重要的项目,但他手头的代码实在太多,Bug 也层出不穷。于是他决定雇人找人帮他调试代码。
在他的通讯录里,有 nn 位程序员愿意接单,但每个人的收费方式和能力都不同:

  • 有的人调一次就能解决多个 Bug,但价格很高。
  • 有的人价格便宜,但只能解决特定类型的 Bug。
  • 有的人甚至会因为调试顺序不同而影响总价。

sanhai 想用最少的花费解决所有 Bug,但他发现这并不是一个简单的贪心问题,而是一个需要精心规划的组合优化问题。


题目概述

给定 nn 位程序员的信息,每位程序员可以解决一组特定的 Bug,并有一个对应的收费价格。
你需要选择若干程序员,使得所有 Bug 都被解决,并且总花费最小。


输入格式

n m
p1 k1 b1_1 b1_2 ... b1_k1
p2 k2 b2_1 b2_2 ... b2_k2
...
pn kn bn_1 bn_2 ... bn_kn
  • 第一行两个整数 nnmm,分别表示程序员数量和 Bug 数量。
  • 接下来 nn 行,每行描述一位程序员的信息:
    • pip_i:该程序员的收费价格(正整数)
    • kik_i:该程序员能解决的 Bug 数量
    • 接下来 kik_i 个整数,表示该程序员能解决的 Bug 编号(编号范围 1m1 \sim m

输出格式

输出一个整数,表示解决所有 Bug 的最小总花费。
如果无法解决所有 Bug,输出 -1


样例输入

4 4
5 2 1 2
6 2 2 3
4 1 4
7 3 1 3 4

样例输出

11

样例解释

  • 选择程序员 1(解决 Bug 1,2,花费 5)
  • 选择程序员 2(解决 Bug 2,3,花费 6)
  • 选择程序员 3(解决 Bug 4,花费 4)
  • 选择程序员 4(解决 Bug 1,3,4,花费 7)

最优方案是选择程序员 1 和程序员 4:

  • Bug 覆盖:1,2(来自程序员 1) + 3,4(来自程序员 4)
  • 总花费:5+7=125 + 7 = 12
    但更优的是选择程序员 2 和程序员 4:
  • Bug 覆盖:2,3(程序员 2) + 1,3,4(程序员 4)
  • 总花费:6+7=136 + 7 = 13(不如上面)

经过 DP 计算,最优解是程序员 1 + 程序员 4,总花费 1111


数据范围与提示

  • 1n1001 \leq n \leq 100
  • 1m201 \leq m \leq 20
  • 1pi1051 \leq p_i \leq 10^5
  • 1kim1 \leq k_i \leq m
  • 本题建议使用状态压缩动态规划,状态数为 2m2^m,转移复杂度 O(n2m)O(n \cdot 2^m)