問題
D – 高橋くんの苦悩
回答
TLE で 0点ですが、まずは再帰的に行う全探索を考えます。
p32 です。
W = int(input())
N, K = map(int, input().split())
AB = [list(map(int, input().split())) for _ in range(N)]
def dfs(used_w, used_n, now):
"""
used_w 今まで選んだ合計幅
used_n 今まで選んだ合計数
now 今調べる番号
"""
# 終了条件
if now == N:
return 0
if used_w >= W or used_n >= K:
return dfs(used_w, used_n, now+1)
# 終了条件を満たさない場合
a = AB[now][0] # 幅
b = AB[now][1] # 重要度
# 更新できる場合
if used_w + a <= W and used_n + 1 <= K:
val_used = dfs(used_w + a, used_n + 1, now+1) + b
val_not_used = dfs(used_w, used_n, now+1)
return max(val_used, val_not_used)
# 更新できない場合
return dfs(used_w, used_n, now+1)
print(dfs(0, 0, 0))