Day40力扣打卡

打卡记录

Day40力扣打卡_第1张图片


包子凑数(裴蜀定理 + DP)

根据裴蜀定理,存在 c = gcd(a, b) 使不定方程ax + by = c满足条件,如果gcd(a, b) == 1即a与b互素的情况下,就会 ax + by = 1,由于为1可以构造后面的无穷数字,故得到结论当 gcd(a, b) == 1 时,才存在有限无法构造的数字情况。根据定理a, b最大无法构造的数字为 (a - 1)(b - 1) - 1,而后再采用 0-1 背包的算法思想解决。

import math
import sys

n, m = int(input()), 10000
nums = [int(input()) for _ in range(n)]

g = nums[0]
for num in nums:
    g = math.gcd(g, num)
if g != 1:
    print("INF")
    sys.exit(0)

f = [0 for _ in range(m)]

for i in range(n):
    f[nums[i]] = 1
    for j in range(nums[i] + 1, m):
        f[j] |= f[j - nums[i]]

cnt = 0
for i in range(1, m):
    if f[i] == 0:
        cnt += 1

print(cnt)

你可能感兴趣的:(leetcode刷题打卡,leetcode,python,算法)