일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 다이나믹 프로그래밍
- Redux
- Javascript
- frontend
- LeetCode
- git
- 자바
- TypeScript
- DFS
- Python
- CS
- DP
- Database
- Algorithm
- 알고리즘
- db
- react
- java
- VIM
- Graph
- 안드로이드
- network
- vscode
- Data Structure
- BFS
- 리트코드
- 프로그래머스
- 그레이들
- 동적 계획법
- 백준
Archives
- Today
- Total
늘 겸손하게
백준 12865 - 평범한 배낭 (C++) 본문
안녕하세요 besforyou입니다
문제 풀이
dp 알고리즘으로 해결해야하는 문제입니다. 그러니 2차원 배열을 하나 선언합시다.
int dp[101][100001];
여기서 dp[a][b] = v 가 의미하는것은 a번째 물건까지 참조했고, 현재 가방에 담긴 물건들의 무게는 b일때 최대 가치가 v 라는 의미입니다.
이를 이용해서 문제를 해결해야합니다.
선형 순차 탐색으로 물건을 하나하나씩 참조해가며 담을 수 있는 최대 가치를 찾을것인데, 고려해야할점이 있습니다.
첫번째로, 물건을 담을 수 있느냐 없느냐 입니다. 현재 참조하는 물건의 무게 + 가방에 담긴 무게가 K를 넘어버리면 담을 수 없겠죠?
두번째로, 가방에 물건을 담는것이 유리한가, 유리하지 않는가 입니다. 현재 참조하는 물건을 가방에 담을 수 있는데 꼭 현재 참조하는 물건을 담는다고 해서 최대 가치를 얻을 수 있는것은 아닙니다.
위 두 조건을 고려하면서 순차적으로 물건을 하나하나씩 참조해야합니다.
여기서 첫번째 조건을 쉽게 만족시키면서 순차 검색을 하는 방법은 j = 1부터 j <= K일때까지 검색을 해보는것입니다.
코드
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
32
33
34
35
36
37
38
39
40
41
42
43
44
|
#include <iostream>
using namespace std;
int N, K;
int weight[101];
int value[101];
int dp[101][100001];
int bigger(int a, int b) {
if ( a > b )
return a;
else
return b;
}
int main (void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N >> K;
for ( int i = 1 ; i <= N ; i++)
cin >> weight[i] >> value[i];
for ( int i = 1 ; i <= N ; i++ )
{
for (int j = 1; j <= K ; j++ )
{
if (j >= weight[i])
dp[i][j] = bigger(dp[i-1][j], dp[i-1][j-weight[i]] + value[i]);
else
dp[i][j] = dp[i-1][j];
}
}
cout << dp[N][K];
return 0;
}
|
cs |
'코딩 문제 > 백준' 카테고리의 다른 글
백준 10709 - 기상캐스터 ( C++ ) (0) | 2021.09.08 |
---|---|
백준 16395 - 파스칼의 삼각형 ( C++ ) (0) | 2021.09.05 |
백준 11660 - 구간 합 구하기 5 (0) | 2021.08.30 |
문제 11054 가장 긴 바이토닉 부분 수열 ( C++ ) (0) | 2021.08.20 |
백준 1932 - 정수 삼각형 (C++) (0) | 2021.08.16 |