가취공부하자

[백준]12865 평범한 배낭 c++ 본문

알고리즘/백준

[백준]12865 평범한 배낭 c++

keepGGoing 2021. 6. 21. 22:45

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