본문 바로가기
알고리즘/[python] 백준 BOJ

[python] 백준 7579 앱

by Alan_Kim 2023. 11. 26.
728x90
반응형

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

 

7579번: 앱

입력은 3줄로 이루어져 있다. 첫 줄에는 정수 N과 M이 공백문자로 구분되어 주어지며, 둘째 줄과 셋째 줄에는 각각 N개의 정수가 공백문자로 구분되어 주어진다. 둘째 줄의 N개의 정수는 현재 활

www.acmicpc.net

 

 

문제 해결

  • 용량 M을 줄여야하는데 $A_{i}$ 바이트와 줄이는데 비용 $C_{i}$가 주어졌다. 이 때 최소비용을 구하는 문제
  • 이는 배낭 문제라고 한다.
  • https://namu.wiki/w/%EB%B0%B0%EB%82%AD%20%EB%AC%B8%EC%A0%9C
     
  • dp[i][j]를 i번째 물건까지 봤을 때 j요금 이하로 만들 수 있는 줄일 수 있는 메모리 합을 이야기한다.
  • j가 i번째 메모리 사용할 때 비용($C_{i}$)보다 작다면 $i$번째 메모리를 사용할 수 없다는 뜻이므로 dp[i][j] = dp[i-1][j]와 같다.
  • j가 i번째 메모리 사용할 때 비용보다 크다면 $i$번째 메모리를 사용할 수 있다는 뜻이다. 그러면 dp[i][j] = max($A[i]$+dp[i-1][j-C[i]], dp[i-1][j])와 같다.
 

배낭 문제 - 나무위키

무게 대비 가치가 다른 물건들을 일정한 용량의 용기에 담아야 한다는 기본 틀에서, 바리에이션이 많다. 가방이 여러 개인 문제, 고려할 변수가 무게와 가치 외에도 더 있는 3개 이상의 변수 문

namu.wiki

 

 

CODE

import sys
input = sys.stdin.readline



def main():
    result = sum(C)
    for i in range(1,N+1):
        byte = A[i]
        cost = C[i]
        
        for j in range(sum(C)+1):
            if j<cost:
                dp[i][j] = dp[i-1][j]
            else:
                dp[i][j] = max(byte+dp[i-1][j-cost], dp[i-1][j])
            
            if dp[i][j] >=M:
                result = min(result, j)
    if M != 0:
        print(result)
    else:
        print(0)
        
if __name__=='__main__':
    N, M = map(int, input().split())
    A = [0] + list(map(int, input().split()))
    C = [0] + list(map(int, input().split()))
    dp = [[0 for _ in range(sum(C)+1)] for _ in range(N+1)]
    
    main()
728x90
반응형

'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글

[python] 백준 2234 성곽  (2) 2023.12.03
[python] 백준 1358 하키  (0) 2023.11.30
[python] 백준 11559 Puyo Puyo  (1) 2023.11.23
[python] 백준 1726 로봇  (1) 2023.11.22
[python] 백준 18808 스티커 붙이기  (0) 2023.11.18

댓글