Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- DP
- 파이썬
- SQLD 이론
- 폴링vs이벤트
- 클린코드
- 백준
- 서버최적화
- MFC
- 오픽 초보
- SQLD이론
- c++
- 주석
- SW개발자를 위한 성능좋은 SQL
- BFS
- Python
- 서버아키텍처
- clean code
- sqld
- beautifulsoup
- 클린 코드
- 알고리즘
- git
- Backtracking
- Javascript
- 게임서버개발
- N-Queen
- 오픽
- 역행자
- 자청
- sqld요약
Archives
- Today
- Total
가취공부하자
[백준]12865 평범한 배낭 c++ 본문
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
[접근 방법]
배낭 문제는 knapsack 알고리즘을 통해푼다.
예제를 바탕으로
n =4, k =7,
6 13
4 8
3 6
5 12 // 무게, 가치 순서
열 인덱스 : 배낭의 최대 무게
1 | 2 | 3 | 4 | 5 | 6 | 7 | |
6 (13) | 0 | 0 | 0 | 0 | 0 | 13 | 13 |
4 (8) | |||||||
3 (6) | |||||||
5 (12) |
먼저 6kg를 기준으로 배낭에 넣어본다. 6kg부터 가치가 생김.
1 | 2 | 3 | 4 | 5 | 6 | 7 | |
6 (13) | 0 | 0 | 0 | 0 | 0 | 13 | 13 |
4 (8) | 0 | 0 | 0 | 8 | 8 | 13 | 13 |
3 (6) | |||||||
5 (12) |
4kg를 배낭에 넣어본다.
4kg와 6kg 아이템만 있다고 가정했을 때 배낭에 담을 수 있는 최대 가치는 13
1 | 2 | 3 | 4 | 5 | 6 | 7 | |
6 (13) | 0 | 0 | 0 | 0 | 0 | 13 | 13 |
4 (8) | 0 | 0 | 0 | 8 | 8 | 13 | 13 |
3 (6) | 0 | 0 | 6 | 8 | 8 | 8 | 8+6 (14) |
5 (12) |
3kg을 배낭에 넣어본다.
배낭 최대 무게가 7kg일 때 4kg와 3kg 아이템이 들어갈 경우 최대 가치를 얻을 수 있다.
1 | 2 | 3 | 4 | 5 | 6 | 7 | |
6 (13) | 0 | 0 | 0 | 0 | 0 | 13 | 13 |
4 (8) | 0 | 0 | 0 | 8 | 8 | 13 | 13 |
3 (6) | 0 | 0 | 6 | 8 | 8 | 8 | 8+6 (14) |
5 (12) | 0 | 0 | 6 | 8 | 12 | 12 | 14 |
5kg을 배낭에 넣어본다.
배낭 최대 무게가 5kg일 때 5kg아이템이 들어갈 때 최대 가치를 얻을 수 있지만
7kg일 때는 3kg+4kg 가치가 더 크다.
이러한 방법을 식으로 표현하면
dp[i][j]= max(dp[i-1][j] , dp[i-1][j-item.무게] + item.가치) |
[코드]
#include <iostream>
#include <algorithm>
using namespace std;
int items[101][2];
int dp[101][100001] = { 0, };
int main() {
int n, k, w, v;
cin >> n >> k;
for (int i = 1; i <= n; i++)
{
cin >> w >> v;
items[i][0] = w;
items[i][1] = v;
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= k; j++)
{
if (j >= items[i][0]) {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - items[i][0]] + items[i][1]);
}
else
dp[i][j] = dp[i-1][j];
}
}
cout << dp[n][k];
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 9663 N-Queen c++ (0) | 2021.10.04 |
---|---|
[백준] 7569 토마토 c++ (0) | 2021.06.28 |
[백준] 1300 K번째 수 c++ (0) | 2021.04.07 |
[백준] 2146 다리만들기 c++ (0) | 2021.04.01 |
[백준] 10775 공항 c++ (0) | 2021.03.31 |