728x90
반응형
https://www.acmicpc.net/problem/12865
12865번: 평범한 배낭
첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000)
www.acmicpc.net
풀이
이 문제는 0-1 배낭문제(0-1Knapsack Problem)이다. 왜냐하면 물건을 나누지 못하고 가진 물건으로 가방에 넣어 최대 가치를 만들어야 하기 때문이다.
dp배열을 (n+1)(k+1)배열의 크기로 만든다. 이유는 조건에 따라 이전의 값과 비교해야 해서 n,k보다 1씩 큰 배열을 만들었다.
각 물건별 각 무게로 for문을 돌면서 현재의 무게가 해당 물건의 무게보다 크면 해당 dp값은 dp[i-1][j](이전물건의 해당무게에서의 가치)와 dp[i-1][j-wv[i][0]]+wv[i][1](이전물건에서 현재가방의 무게-현재물건무게의 dp값 + 현재 물건의 가치)를 비교해서 큰 값으로 업데이트해주었다. 그러면 dp[n][k]에서 해당 가방에 물건을 넣어 만들 수 있는 최대 가치를 구할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
n,k=map(int, input().split())
wv=[(0,0)]
dp=[[0]*(k+1) for i in range(n+1)]
for _ in range(n):
x,y=map(int, input().split())
wv.append((x,y))
for i in range(1,n+1):
for j in range(1,k+1):
if j>=wv[i][0]:
dp[i][j]=max(dp[i-1][j],dp[i-1][j-wv[i][0]]+wv[i][1])
else:
dp[i][j]=dp[i-1][j]
print(dp[n][k])
|
cs |
728x90
반응형
'Python3 > 백준 알고리즘' 카테고리의 다른 글
2022.03.22 [백준] (python 파이썬) 가장 큰 정사각형 (0) | 2022.03.22 |
---|---|
2022.03.18 [백준] (python 파이썬) 팰린드롬? (0) | 2022.03.18 |
2022.03.17 [백준] (python 파이썬) 케빈 베이컨의 6단계 법칙 (0) | 2022.03.17 |
2022.03.14 [백준] (python 파이썬) 거스름돈 (0) | 2022.03.14 |
2022.03.10 [백준] (python 파이썬) IOIOI (0) | 2022.03.10 |
댓글