Loading

最小覆盖用例数

i, j = map(int, input().split())

# 解析覆盖矩阵
matrix = []
for _ in range(i):
    matrix.append(list(map(int, input().split())))

# 初始化目标集合(需要覆盖的所有模块)
target = set(range(j))

# 贪心算法:选择覆盖最多未覆盖模块的用例
selected = []
covered = set()

flag = 1

while covered != target:
    best_test_case = None
    best_coverage = 0

    for idx, test_case in enumerate(matrix):
        # 当前用例能覆盖的未覆盖模块
        current_coverage = sum(1 for k in range(j) if test_case[k] == 1 and k not in covered)

        if current_coverage > best_coverage:
            best_coverage = current_coverage
            best_test_case = idx

    # 无法继续覆盖新模块,返回 -1
    if best_test_case is None:
        flag = 0

    # 选择当前最优用例,并更新覆盖情况
    selected.append(best_test_case)
    for k in range(j):
        if matrix[best_test_case][k] == 1:
            covered.add(k)

# 输出最小用例集合的大小
if flag == 1:
    print(len(selected))
else:
    print(-1)
# 4 4
# 1 0 1 0
# 0 1 0 1
# 1 1 0 0
# 0 0 1 1

2

# 3 2
# 1 0
# 0 1
# 1 1

1
posted @ 2025-04-16 19:22  Duancf  阅读(40)  评论(0)    收藏  举报