▼考え方:
1.りんごを0個購入するときの金額の最小値は0円
2.りんごを1個からx個のいずれかを購入するときの金額の最小値はa円
3.りんごをx+1個より多く購入するときの金額の最小値は、以下3.1、3.2のように計算する。今回はi個購入するとする
3.1. まず、りんごx個a円を購入する場合を考える。10,000,000円と、購入前の個数(i-x個)の金額の最小値(dp[i-x])にa円を加えた金額を比較し、小さいほうを最小値とする(事実上、後者が最小値になる。)
3.2. 次に、りんごy個b円を購入する場合を考える。3.1で計算した最小値と、購入前の個数(i-y個)の金額の最小値(dp[i-y])にb円を加えた金額を比較し、小さいほうを最小値とする
3.3. 最後に、りんごz個c円を購入する場合を考える。3.2で計算した最小値と、購入前の個数(i-z個)の金額の最小値(dp[i-z])にc円を加えた金額を比較し、小さいほうを最小値とする
4.題意より、i個以上購入する可能性があるため、i個以上購入したときの金額の最小値を計算する
▼コード:
########## 処理0(準備) インプット,リスト定義など ###########
n,x,a,y,b,z,c = map(int, input().split())
# dp: りんごをi個購入した時の金額の最小値を格納するリスト
dp = [10000000] * (n+z)
########## 処理1 漸化式の定義、計算、出力 ##########
# 考え方1参照
dp[0] = 0
# 考え方2参照
for i in range(1,x):
dp[i] = a
# 考え方3参照
for i in range(x+1,n+z):
if i >= x+1:
# 考え方3.1参照
dp[i] = min(dp[i], dp[i-x] + a)
if i >= y:
# 考え方3.2参照
dp[i] = min(dp[i], dp[i-y] + b)
if i >= z:
# 考え方3.3参照
dp[i] = min(dp[i], dp[i-z] + c)
# 考え方4参照
print(min(dp[n:]))
▼気づいたこと:
考え方2のforループは、不要ですね。考え方3のforループに集約が可能でした。
集約にあたっては、考え方3のforループの開始をx+1ではなく1にします。