#S1001. Sanhai 的求调
Sanhai 的求调
题目背景
sanhai 最近在赶一个重要的项目,但他手头的代码实在太多,Bug 也层出不穷。于是他决定雇人找人帮他调试代码。
在他的通讯录里,有 位程序员愿意接单,但每个人的收费方式和能力都不同:
- 有的人调一次就能解决多个 Bug,但价格很高。
- 有的人价格便宜,但只能解决特定类型的 Bug。
- 有的人甚至会因为调试顺序不同而影响总价。
sanhai 想用最少的花费解决所有 Bug,但他发现这并不是一个简单的贪心问题,而是一个需要精心规划的组合优化问题。
题目概述
给定 位程序员的信息,每位程序员可以解决一组特定的 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
- 第一行两个整数 和 ,分别表示程序员数量和 Bug 数量。
- 接下来 行,每行描述一位程序员的信息:
- :该程序员的收费价格(正整数)
- :该程序员能解决的 Bug 数量
- 接下来 个整数,表示该程序员能解决的 Bug 编号(编号范围 )
输出格式
输出一个整数,表示解决所有 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)
- 总花费:
但更优的是选择程序员 2 和程序员 4: - Bug 覆盖:2,3(程序员 2) + 1,3,4(程序员 4)
- 总花费:(不如上面)
经过 DP 计算,最优解是程序员 1 + 程序员 4,总花费 。
数据范围与提示
- 本题建议使用状态压缩动态规划,状态数为 ,转移复杂度 。