fork download
  1. import sys
  2.  
  3. def solve():
  4. # 標準入力からデータを読み込む
  5. input_lines = sys.stdin.read().split('\n')
  6.  
  7. # 空行を除去して整理する
  8. lines = [line.strip() for line in input_lines if line.strip()]
  9.  
  10. if len(lines) < 3:
  11. return
  12.  
  13. # 1行目: ナップサックの容量 W
  14. W = int(lines[0])
  15.  
  16. # 2行目: 各アイテムの大きさ(重さ)のリスト
  17. weights = list(map(int, lines[1].split()))
  18.  
  19. # 3行目: 各アイテムの価値のリスト
  20. values = list(map(int, lines[2].split()))
  21.  
  22. # アイテムの数
  23. n = len(weights)
  24.  
  25. # DPテーブルの作成
  26. # dp[i][j] は、i個までのアイテムを使って容量jの時に得られる最大価値
  27. # iは 0 から n, j は 0 から W までのサイズを持つ2次元配列
  28. dp = [[0 for _ in range(W + 1)] for _ in range(n + 1)]
  29.  
  30. # 動的計画法の実行
  31. for i in range(1, n + 1):
  32. item_weight = weights[i-1] # 現在のアイテムの重さ (0-indexなので-1)
  33. item_value = values[i-1] # 現在のアイテムの価値 (0-indexなので-1)
  34.  
  35. for j in range(W + 1):
  36. if j < item_weight:
  37. # 容量不足で現在のアイテムが入らない場合、前の状態を引き継ぐ
  38. dp[i][j] = dp[i-1][j]
  39. else:
  40. # アイテムを入れる場合と入れない場合で価値が大きい方を選ぶ
  41. # OPT(i, j) = max( OPT(i-1, j), OPT(i-1, j - weight) + value )
  42. dp[i][j] = max(dp[i-1][j], dp[i-1][j - item_weight] + item_value)
  43.  
  44. # 最終的な解 OPT(n, W) を出力
  45. print(dp[n][W])
  46.  
  47. if __name__ == '__main__':
  48. solve()
Success #stdin #stdout 0.11s 14096KB
stdin
10
1 4 7 3 4 9
4 3 9 1 7 5
stdout
14