赤ちゃんからPythonを学ぼう!Python を使用して、情報オリンピックのオールインワン Web サイトのトピックを完成させ、あらゆる瞬間を記録します。
要約投稿を添付してください: Informatics Olympiad All-in-One Python Edition |
【説明】
古典的な 0-1 ナップザック問題では、アイテムが n 個あり、番号 i のアイテムの重さは w[i]、値は c[i] です。ここで、これらのアイテムからいくつかのアイテムを選択して、それらを容量 m のナップザック、総重量が m を超えないことを前提として、バックパック内の物の値をできるだけ大きくします。
【入力】
行 1: 2 つの整数、n (アイテムの数、n≤3500) と m (バックパックの容量、m≤12880)。
行 2...n+1: 各行の 2 つの整数 w[i] と c[i] は、各項目の重みと値を表します。
【出力】
最大合計値を示す 1 行、1 つの数字のみ。
【入力サンプル】
4 6
1 4
2 6
3 12
2 7
【出力例】
23
【コード説明】
n,m = [int(i) for i in input().split()]
Wi = [0]
Ci = [0]
dp = [0 for i in range(m+1)]
for i in range(1, n+1):
ls = [int(i) for i in input().split()]
Wi.append(ls[0])
Ci.append(ls[1])
for i in range(1, n+1):
for j in range(m, Wi[i]-1, -1):
dp[j] = max(dp[j], dp[j - Wi[i]] + Ci[i])
print(dp[m])
【運用結果】
4 6
1 4
2 6
3 12
2 7
23