問題
C – 123引き算
回答
全探索は \( 3^{100} \) であり、難しい。
貪欲法
3を引けるときにそれより小さい数字を引く必要はないので、引ける数のうち最も大きな数字を引けば良い。
N = int(input()) NG = [int(input()) for _ in range(3)] def check(N, NG): if N in NG: return 'NO' num = N for _ in range(100): if num - 3 not in NG: num -= 3 elif num - 2 not in NG: num -= 2 elif num - 1 not in NG: num -= 1 else: return 'NO' if num > 0: return 'NO' return 'YES' print(check(N, NG))
動的計画法
dp[N]
を0として、ある数字にたどり着くまでに最低必要な手数をdp[i]
として動的計画法を行います。
N = int(input()) NG = [int(input()) for _ in range(3)] f_inf = float('inf') dp = [f_inf] * 301 dp[N] = 0 for i in range(N, -1, -1): if i in NG: continue for j in range(1, 4): dp[i-j] = min(dp[i]+1, dp[i-j]) if dp[0] <= 100: print('YES') else: print('NO')