ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 0-1 Kanpsack 알고리즘 문제 모음
    코테 준비/DP 2023. 4. 7. 20:42

    0-1 Kanpsack 알고리즘


    배낭문제: 일정한 가치와 무게가 정해져있는 짐들을 배낭에 담을 때, 가치의 합이 최대가 되도록 짐을 고르는 방법을 찾는 문제

    가방의 가치: value

    가방의 무게: weight

    최대이윤=dp[n]이라고 할때 

    dp[i]=max(dp[i],dp[i-weight]+value)

     

    129865 평범한 배낭

    n,k=map(int,input().split())
    bag=[]
    for i in range(n):
      w,v=map(int,input().split())
      bag.append((w,v))
    bag.sort(key=lambda x:x[1])
    
    dp = [0]*(k+1)
    for w, v in bag:
        for i in range(k, w-1, -1):
            dp[i] = max(dp[i], dp[i-w]+v)
    print(dp)

     

    1535 안녕

    n=int(input())
    h=[]
    health=list(map(int,input().split()))
    happy=list(map(int,input().split()))
    for i in range(n):
        h.append((health[i],happy[i]))
    h.sort(key=lambda x:-x[1]) # happy 높은 순으로 정렬
    # (21,30),(79,25),(1,20)
    dp=[0]*101
    for health, happy in h:
        for i in range(100,health-1,-1): #100부터 health까지
                dp[i] = max(dp[i], dp[i-health]+happy)
                #i=100~21  dp[i]와 dp[i-21]+30 중 최대값
                #i=100~79  dp[i]와 dp[i-79]+25 중 최대값
                #i=100~1   dp[i]와 dp[i-1]+20 중 최대값
    print(dp[99])

     

    16493 최대페이지 수

    n,m=map(int,input().split())
    bag=[]
    for i in range(m):
        day,page=map(int,input().split())
        bag.append((day,page))
    bag.sort(key=lambda x:-x[1])
    
    dp=[0]*(n+1)
    for day,page in bag:
        for i in range(n,day-1,-1):
            dp[i]=max(dp[i],dp[i-day]+page)
    
    print(dp[n])

    '코테 준비 > DP' 카테고리의 다른 글

    [프로그래머스] 등굣길  (1) 2024.02.06
    [백준] 16493. 최대페이지 수  (0) 2023.04.07
    [백준] 12852. 1로 만들기 2  (0) 2023.02.25
    [백준] 10844. 쉬운 계단 수  (0) 2023.02.05
    [프로그래머스] 3xn 타일링  (0) 2023.01.24
Designed by Tistory.