일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- javascript
- yolo
- 순환참조
- pandas
- 양방향 매핑
- STT
- Spring Boot
- YOLOv5
- Expo
- 커스텀 데이터 학습
- html
- JPA
- 2021 제9회 문화공공데이터 활용경진대회
- idToken
- matplotlib
- @Transactional
- skt fellowship 3기
- google cloud
- Spring
- C++
- OG tag
- oauth
- 코드업
- Loss Function
- 졸프
- google 로그인
- AWS
- marksense.ai
- react native
- google login
- Today
- Total
민팽로그
[백준 / BOJ] 12865: 평범한 배낭 본문
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
문제
이 문제는 아주 평범한 배낭에 관한 문제이다.
한 달 후면 국가의 부름을 받게 되는 준서는 여행을 가려고 한다. 세상과의 단절을 슬퍼하며 최대한 즐기기 위한 여행이기 때문에, 가지고 다닐 배낭 또한 최대한 가치 있게 싸려고 한다.
준서가 여행에 필요하다고 생각하는 N개의 물건이 있다. 각 물건은 무게 W와 가치 V를 가지는데, 해당 물건을 배낭에 넣어서 가면 준서가 V만큼 즐길 수 있다. 아직 행군을 해본 적이 없는 준서는 최대 K만큼의 무게만을 넣을 수 있는 배낭만 들고 다닐 수 있다. 준서가 최대한 즐거운 여행을 하기 위해 배낭에 넣을 수 있는 물건들의 가치의 최댓값을 알려주자.
입력
첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000)가 주어진다.
입력으로 주어지는 모든 수는 정수이다.
출력
한 줄에 배낭에 넣을 수 있는 물건들의 가치합의 최댓값을 출력한다.
예제 입력
4 7
6 13
4 8
3 6
5 12
예제 출력
14
코드
#include <iostream>
#include <algorithm>
using namespace std;
int dp[101][100001], w[101], v[101];
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++)
cin >> w[i] >> v[i];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= k; j++) {
// 1. 물건을 담을 수 있는 경우
if (j >= w[i])
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
// 2. 물건을 담을 수 없는 경우
else dp[i][j] = dp[i - 1][j];
}
}
cout << dp[n][k];
return 0;
}
제한된 무게 내에서, 가방에 담은 물건들의 가치 합이 최고가 되는 값을 구하는 문제이다.
dp[i][j]은 i번째 물건의 무게가 j일 때, 가방에 담겨있는 물건들의 최고 가치 합을 나타낸다.
첫번째 물건부터 n번째 물건까지 차례로 탐색한다.
탐색하는 과정에서 다음과 같이 2가지 경우가 발생할 수 있다.
- 현재 탐색하고 있는 물건을 가방에 담을 수 있는 경우
- 현재 탐색하고 있는 물건을 가방에 담을 수 없는 경우
첫번째의 경우, 물건을 가방에 담았을 때 무게 제한을 초과하지 않는다면 물건을 담을 수 있다.
두번째의 경우, 물건을 가방에 담았을 때 무게 제한을 초과한다면 해당 물건은 담을 수 없다.
이때, 무게 조건을 초과하지 않아 물건을 가방에 담을 수 있는 첫번째 경우에 대하여 다음과 같이 2가지 경우가 또 발생한다.
- 해당 물건을 가방에 담는 경우
- 해당 물건을 가방에 담지 않는 경우
해당 물건을 담지 않고 다른 물건들을 담았을 때, 더 높은 가치 합이 만들어질 수도 있다.
문제를 풀기 위해 먼저 물건을 가방에 넣을 수 있는지 판단한 후에, 해당 물건을 넣을것인지 여부를 판단해주어야 한다.
현재 탐색하고 있는 물건을 넣을 수 있는지 판단하기 위해서는 기존 가방에 들어있는 물건들의 무게 합을 알아야 한다. 이를 위해 가방의 무게 합을 모두 저장하는 것은 비효율적이다. 가방의 무게 제한은 K이기 때문에, 모든 물건에 대하여 모든 무게의 조합을 저장해놓고 살펴볼 필요 없이, i번째 물건에 대해 무게가 1인 경우부터 K인 경우까지만 탐색하면 된다.
'PS > 백준📖' 카테고리의 다른 글
[백준 / BOJ] 1931번: 회의실 배정 (0) | 2021.12.29 |
---|---|
[백준 / BOJ] 11047번: 동전 0 (0) | 2021.12.29 |
[백준 / BOJ] 1912번: 연속합 (0) | 2021.12.15 |
[백준 / BOJ] 9251번 : LCS (0) | 2021.12.12 |
[백준 / BOJ] 2565번: 전깃줄 (0) | 2021.12.11 |