#334. 软件补丁问题

软件补丁问题

题目描述

T 公司发现其研制的一个软件中有n\red{n} 个错误,随即为该软件发放了一批共m\red{m} 个补丁程 序。每一个补丁程序都有其特定的适用环境,某个补丁只有在软件中包含某些错误而同时又 不包含另一些错误时才可以使用。一个补丁在排除某些错误的同时,往往会加入另一些错误。 换句话说,对于每一个补丁i\red{i},都有2\red{2} 个与之相应的错误集合B1[i]\red{B1[i]}B2[i]\red{B2[i]},使得仅当软件 包含B1[i]\red{B1[i]}中的所有错误,而不包含B2[i]\red{B2[i]}中的任何错误时,才可以使用补丁i\red{i}。补丁i\red{i} 将修复 软件中的某些错误F1[i]\red{F1[i]},而同时加入另一些错误F2[i]\red{F2[i]}。另外,每个补丁都耗费一定的时间。 试设计一个算法,利用T 公司提供的m\red{m}个补丁程序将原软件修复成一个没有错误的软件,并使修复后的软件耗时最少。

编程任务: 对于给定的n\red{n}个错误和m\red{m}个补丁程序,找到总耗时最少的软件修复方案。

输入格式

1\red{1} 行有2\red{2} 个正整数n\red{n}m\red{m}n\red{n} 表示错误总数,m\red{m} 表示补丁总数,1<=n<=20,1<=m<=100\red{1<=n<=20, 1<=m<=100}。接下来m\red{m}行给出了m\red{m}个补丁的信息。每行包括一 个正整数,表示运行补丁程序i\red{i} 所需时间,以及2\red{2} 个长度为n\red{n}的字符串,中间用一个空格符 隔开。第1\red{1} 个字符串中,如果第k\red{k}个字符bk为“+”,则表示第k\red{k}个错误属于B1[i]\red{B1[i]},若为“-”, 则表示第k个错误属于B21[i]\red{B21[i]},若为“0”,则第k个错误既不属于B1[i]\red{B1[i]}也不属于B2[i]\red{B2[i]},即 软件中是否包含第k\red{k}个错误并不影响补丁i\red{i}的可用性。第2\red{2} 个字符串中,如果第k个字符bk 为“-”,则表示第k\red{k}个错误属于F1[i]\red{F1[i]},若为“+”,则表示第k\red{k}个错误属于F2[i]\red{F2[i]},若为“0”, 则第k个错误既不属于F1[i]\red{F1[i]}也不属于F2[i]\red{F2[i]},即软件中是否包含第k\red{k}个错误不会因使用补丁 i\red{i} 而改变。

输出格式

程序运行结束时,将总耗时数输出。如果问题无解,则输出0\red{0}

样例

输入样例

3 3
1 000 00-
1 00- 0-+
2 0-- -++

输出样例

8