AtCoder Beginner Contest 167 C题,https://atcoder.jp/contests/abc167/tasks/abc167_c。
Takahashi, who is a novice in competitive programming, wants to learn M algorithms. Initially, his understanding level of each of the M algorithms is 0.
Takahashi is visiting a bookstore, where he finds NN books on algorithms. The i-th book (1 ≤ i ≤ N) is sold for Ci yen (the currency of Japan). If he buys and reads it, his understanding level of the jj-th algorithm will increase by Ai,j for each j (1 ≤ j ≤ M). There is no other way to increase the understanding levels of the algorithms.
Takahashi's objective is to make his understanding levels of all the M algorithms X or higher. Determine whether this objective is achievable. If it is achievable, find the minimum amount of money needed to achieve it.
Input is given from Standard Input in the following format:
N M X
C1 A1,1 A1,2 ... A1,M
C2 A2,1 A2,2 ... A2,M
.
.
.
CN AN,1 AN,2 ... AN,M
If the objective is not achievable, print -1
; otherwise, print the minimum amount of money needed to achieve it.
3 3 10
60 2 2 4
70 8 7 9
50 2 3 9
120
Buying the second and third books makes his understanding levels of all the algorithms 10 or higher, at the minimum cost possible.
3 3 10
100 3 1 4
100 1 5 9
100 2 6 5
-1
Buying all the books is still not enough to make his understanding levels of all the algorithms 10 or higher.
8 5 22
100 3 7 5 3 1
164 4 5 2 7 8
334 7 2 7 2 9
234 4 7 2 8 2
541 5 4 3 3 6
235 4 8 6 9 7
394 3 6 1 6 2
872 8 4 3 7 2
1067
告诉我们 N 本书,M 个算法,第 i 本书的售价是 Ci,读第 i 本书对第 j 个算法理解能力将提升 Ai,j。要求我们找到最小的代价,满足我们对 M 个算法的理解都能到达 X。如果没有,输出 -1。
讲真,看到这个题目,当时就炸裂了。我去,AtCoder Beginner Contest 的惯例,前面 4 题基本都不涉及到复杂算法。看到本题,我的第一反应是背包问题。后面仔细分析完样例数据后,可以使用 DFS 来解决。
从数学角度上看,本题就是满足条件的搜索过程。
根据样例数据 1,我们知道一共有 3 本书,3 种算法,要求达到 10 点了解度。下面我们将数据进行一下简单的加工,以方便我们分析。
(1) 60 2 2 4
(2) 70 8 7 9
(3) 50 2 3 9
每组数据前面括号表示编号。这样我们知道就是在全部的组合中找到最小的代价。因此我们的能的组合数为:
(1)
(2)
(3)
(1) (2)
(1) (3)
(2) (3)
(1) (2) (3)
上面什么意思呢?
1、读一本书,看是否满足对 M 种算法达到了解度 X。这样我们的组合可能性有 C(n, 1) 种,因此是 C(3, 1)=3,对应的可能性是(1)、(2)或者(3)。如果有满足条件,记录下最小的代价。
2、读两本书,看是否满足对 M 种算法达到了解度 X。这样我们的组合可能性有 C(n, 2) 种,因此是 C(3, 2)=3,对应的可能性是(1) (2)、(1) (3)或者(2) (3)。如果有满足条件,记录下最小的代价。
3、读两三书,看是否满足对 M 种算法达到了解度 X。这样我们的组合可能性有 C(n, 3) 种,因此是 C(3, 3)=1,对应的可能性是(1) (2) (3)。如果有满足条件,记录下最小的代价。
这样所有的组合搜索完成后,我们就可以得到答案。具体过程请参看下表。
方案 | 算法了解度 | 代价 | 结论 |
(1) | 2 2 4 | 60 | 不满足要求 |
(2) | 8 7 9 | 70 | 不满足要求 |
(3) | 2 3 9 | 50 | 不满足要求 |
(1) (2) | 10 9 13 | 130 | 不满足要求 |
(1) (3) | 4 5 13 | 110 | 不满足要求 |
(2) (3) | 10 10 18 | 120 | 满足要求 |
(1) (2) (3) | 12 12 22 | 180 | 满足要求 |
根据上表,我们可以看出,满足所有算法都达到 10 了解度的解决方案有 2 种,即 (2) (3) 和 (1) (2) (3),其中最小代价为 120。
样例数据 2 一共有 3 本书,3 种算法,要求达到 10 点了解度。
具体过程请参看下表。
方案 | 算法了解度 | 代价 | 结论 |
(1) | 3 1 4 | 100 | 不满足要求 |
(2) | 1 5 9 | 100 | 不满足要求 |
(3) | 2 6 5 | 100 | 不满足要求 |
(1) (2) | 4 6 13 | 200 | 不满足要求 |
(1) (3) | 5 7 9 | 200 | 不满足要求 |
(2) (3) | 3 11 14 | 200 | 不满足要求 |
(1) (2) (3) | 6 12 18 | 300 | 不满足要求 |
根据上表,我们可以看出,没有满足所有算法都达到 10 了解度的解决方案,因此输出 -1。
样例数据 3 一共有 8 本书,5 种算法,要求达到 22 点了解度。因此一共有 C(8,1)+C(8,2)+C(8,3)+C(8,4)+C(8,5)+C(8,6)+C(8,7)+C(8,8)=8+28+56+70+56+26+8=254 种。
由于数据量比较大,我就不写了。
N 的最大值为 12,因此计算量是有限的。C(12,1)+C(12,2)+C(12,3)+C(12,4)+C(12,5)+C(12,6)+C(12,7)+C(12,8)+C(12,9)+C(12,10)+C(12,11)+C(12,12)=12+66+220+495+792+924+792+495+220+66+12=4094 种。
X 的最大值为 10^5。int 表示可以解决。
Ci 的最大值为 10^5。因此 12 本书的价格最大值为 12*10^5=1.2*10^6,int 表示可以解决。
Ai,j 的最大值为 10^5。因此 12 本书的了解度最大值为 12*10^5=1.2*10^6,int 表示可以解决。
通过分析,我们知道可以使用 DFS 来解决问题,因此本题套用 DFS 模板即可。DFS 的解题套路可以参考这个文章,https://blog.csdn.net/justidle/article/details/104925699。因此本题的算法就两步:
1、读入数据。
2、开始 DFS。
我们参考样例输入 1 的数据,DFS 的搜索过程如下:
(1) -> (1) (2) -> (1) (2) (3) -> (2) -> (2) (3) -> (1) (3) -> (3)