목적 : M 바이트의 메모리가 필요한 앱 B를 새로 실행할 때 A의 앱을 비활성화하고 실행하는 비용 c의 합을 최소화하는 방법을 찾기
한 여행자가 여행을 하러 갈때 배낭에 담을 수 있는 무게의 최댓값이 있고 배낭에 넣을 수 있는 짐에는 각각 무게와 가치가 있을 때 배낭 무게를 최대로 하면서 가치의 합이 최대가 되도록 하는 문제
import sys
# W: 배낭의 무게한도, wt: 각 보석의 무게, val: 각 보석의 가격, n: 보석의 수
def knapsack(W, wt, val, n):
# DP를 위한 2차원 리스트 초기화
K = [[0 for x in range(W+1)] for x in range(n+1)]
for i in range(n+1):
# 각 칸을 돌면서
for w in range(W+1):
# 0번째 행/열은 0으로 세팅
if i==0 or w==0:
K[i][w] = 0
# 점화식을 그대로 프로그램으로
elif wt[i-1] <= w:
K[i][w] = max(val[i-1]+K[i-1][w-wt[i-1]], K[i-1][w])
# max 함수 사용하여 큰 것 선택
else:
K[i][w] = K[i-1][w]
return K[n][W]
wt = []
val = []
N, K = map(int, sys.stdin.readline().strip().split())
for i in range(N):
w, v = map(int, sys.stdin.readline().strip().split())
wt.append(w)
val.append(v)
print(knapsack(K, wt, val, N))
조건
import sys
N, M = map(int, sys.stdin.readline().split())
memory = list(map(int, sys.stdin.readline().split()))
cost = list(map(int, sys.stdin.readline().split()))
max_cost = sum(cost)
def app(n, m, mem, co):
global max_cost
dp = [[0 for _ in range(sum(co)+1)] for _ in range(n+1)]
for i in range(n):
for j in range(len(dp[0])):
if co[i] > j:
dp[i][j] = dp[i - 1][j]
else:
dp[i][j] = max(dp[i - 1][j - co[i]] + mem[i], dp[i - 1][j])
if dp[i][j] >= m:
max_cost = min(max_cost, j)
return max_cost
print(app(N, M, memory, cost))