0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

paizaラーニング問題集「【最安値】最安値を達成するには 4」を解いてみた

Posted at

▼考え方:

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にします。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?