algorithm

DP - μ•„μ΄ν…œμ„ 적절히 κ³ λ₯΄λŠ” 문제

rkawk 2025. 3. 21. 00:49

 

μ§€κΈˆκΉŒμ§€ μ‚¬μš©ν•œ λ™μ „μ˜ 총 κΈˆμ•‘μ΄ κ°™λ‹€λ©΄ -> 동전이 μ μ„μˆ˜λ‘ / λ§Žμ„μˆ˜λ‘ 더 μ’‹λ‹€.

dp[i] = μ§€κΈˆκΉŒμ§€ μ„ νƒν•œ λ™μ „μ˜ 합이 iμΌλ•Œ, κ°€λŠ₯ν•œ μ΅œλŒ€ λ™μ „μ˜ 개수.

 

dp[i] = max/min ( 0<=j<N i >= coin[j] ) dp[i - coin[j]] + 1

 

  for(int i=1; i<=M; i++) {
        for(int j=0; j<N; j++) {
            if(coin[j] > i || dp[i - coin[j]] == -1) continue;
            if(dp[i] == -1) {
                dp[i] = dp[i - coin[j]] + 1;
            }else {
                dp[i] = min(dp[i], dp[i - coin[j]] + 1);
            }
        }
    }

 

dp[0] = 0이고, 0을 κΈ°μ€€μœΌλ‘œ coin λ°°μ—΄μ˜ 첫 μ›μ†ŒλΆ€ν„° λκΉŒμ§€ νƒμƒ‰ν•˜λ©° dp 배열을 κ°±μ‹ ν•œλ‹€.

-> μ›μ†Œμ˜ κ°œμˆ˜κ°€ λ¬΄ν•œ, μ€‘λ³΅λœλ‹€λŠ” κ°€μ •.

쀑볡 λ˜μ§€ μ•ŠλŠ” μ›μ†Œλ‘œ ꡬ할 μˆ˜μžˆλŠ” μ΅œλŒ€/μ΅œμ†Œ 합을 κ΅¬ν•˜λ €λ©΄

μœ„μ˜ μ†”λ£¨μ…˜μ—μ„œ M을 거꾸둜 κ°€κ²Œ ν•˜λ©΄ λœλ‹€.

 

dp[0] = 0;
    for(int i=0; i<n; i++) {
        for(int j=m; j>=0; j--) {
            if(j >= A[i]) 
                dp[j] = min(dp[j], dp[j - A[i]] + 1);
        }
    }