b_wy_小易的考试成绩(01背包变种)

n 个题目,第 i 个题目的分数是 si。如果小易第 i 题目回答正确,他将得到 Si 分,否则该题目他将得到 0 分。
最终的考试得分是所有题目得分的总和。由于阅卷老师很讨厌数字 5,在阅卷时如果一个学生的考试总分中含有数字 5,那么阅卷老师将气愤地给他 0 分。
那么小易考试的最高得分是多少?

思路:不断地求组合肯定超时,这里用反向思维,用组合分数作为下标,值为True/False

def solve(A, n):
    s=sum(A)
    f=[False for i in range(s+1)]
    f[0]=f[s]=True
    for x in A:
        for j in range(s,x-1,-1): #01背包的核心就是循环的起始数值
            f[j]|=f[j-x]
    for i in range(s,-1,-1): #贪心找最大
        if f[i] and str(i).find('5')==-1:
            return i
    return 0
n = int(input())
A = list(map(int, input().split()))
print(solve(A,n))
原文地址:https://www.cnblogs.com/wdt1/p/14409082.html