Notice
Recent Posts
Recent Comments
ยซ   2024/09   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags more
Archives
Today
Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐ŸŒฒ์ž๋ผ๋‚˜๋Š”์ฒญ๋…„

[๋ฐฑ์ค€] ๋™์ „1 ํŒŒ์ด์ฌ ํ’€์ด(DP) ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ’€์ด

[๋ฐฑ์ค€] ๋™์ „1 ํŒŒ์ด์ฌ ํ’€์ด(DP)

JihyunLee 2019. 12. 4. 16:05
๋ฐ˜์‘ํ˜•

 

๋ฐฑ์ค€ 2293๋ฒˆ ๋™์ „1์„ ํ’€์–ด๋ณด์•˜๋‹ค.

https://www.acmicpc.net/problem/2293

์ฒ˜์Œ์—” ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ ํ’€์–ด๋ณด์•˜๊ณ , ๊ทธ๋‹ค์Œ์—๋Š” stack์„ ์ด์šฉํ•ด์„œ ํ’€์–ด๋ณด์•˜์ง€๋งŒ ๋‘˜๋‹ค, ์‹œ๊ฐ„์ดˆ๊ณผ, ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋˜์–ด ๋งž์•˜๋Š”์ง€ ์–ด์จŒ๋Š”์ง€ ์•Œ ์ˆ˜๊ฐ€ ์—†์—ˆ๋‹ค.

๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ ํ’€์–ด ๋ณธ ํ’€์ด

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
def main():
    N, goal = map(int,input().split())
 
    coin = []
 
    for i in range(N):
        coin.append(int(input()))
    
    coin = sorted(coin, reverse = True )
 
 
    cnt = 0 
    # print(coin)
    def do(money_sum, index):
        nonlocal cnt 
        if index < len(coin):
            temp = 0
            while 1:
                if(money_sum + coin[index]*temp==goal):
                    cnt +=1
                    break
                    
                elif(money_sum + coin[index]*temp<goal):
                    do(money_sum+coin[index]*temp, index+1)
                    temp +=1
                else:
                    break
 
    do(0,0)
        
    print(cnt)
 
 
 
 
 
if __name__ == "__main__":
    main()
cs

 

์Šคํƒ์„ ์ด์šฉํ•ด์„œ ํ’€์–ด๋ณธ ํ’€์ด

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 
 
def main():
    N, goal = map(int,input().split())
 
    coin = []
 
    for i in range(N):
        coin.append(int(input()))
    
 
    coinstack = [0]
    cnt =0 
    
    for num in coin:
        # print(num)
        coinstack, cnt =addto(coinstack, num, goal, cnt)
 
 
    print(cnt)
   
def addto(coinstack, num, goal,cnt):
    newstack = []
 
    while coinstack:
        currsum = coinstack.pop(0)
        temp = 0
        while 1:
            if(currsum + num*temp==goal):
                cnt +=1 
                break
            elif(currsum + num*temp<goal):
                newstack.append(currsum + num*temp)
                temp +=1
            else:
                break
    # print(newstack, cnt)
    return newstack, cnt
    
 
 
 
 
 
if __name__ == "__main__":
    main()
cs

 

๊ทธ๋ž˜์„œ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ dp๋กœ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ–ˆ๊ณ , dp๋กœ ํ’€์–ด๋ณด์•˜๋‹ค.

https://marades.tistory.com/5 (์ฐธ๊ณ ํ•œ ๋ธ”๋กœ๊ทธ)

๋‚ด๊ฐ€ ๋ณธ dp์ค‘์— ๊นŒ๋‹ค๋กœ์šด ํŽธ์— ์†ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

 

์ •๋‹ต ํ’€์ด

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
import sys 
 
def main():
    N, goal = map(int,sys.stdin.readline().split())
 
    coins = []
 
    for _ in range(N):
        coins.append(int(sys.stdin.readline()))
 
    dp = [0 for _ in range(goal+1)]
    dp[0= 1 
    for coin in coins:
        for i in range(coin, goal+1):
            dp[i] += dp[i-coin]
 
    print(dp[goal])
 
 
 
 
if __name__ == "__main__":
    main()
 
cs
๋ฐ˜์‘ํ˜•