거의 알고리즘 일기장

백준 12865번 _ 평범한 배낭 본문

알고리즘 문제풀이

백준 12865번 _ 평범한 배낭

건우권 2020. 5. 10. 18:13

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

풀이방법

그냥 냅색 알고리즘이다.

 

dp[가방종류][무게] = 가질수있는 최대가치 

이렇게 dp를 설정해두고, dp[i][j] = max(dp[i][j] = max(dp[i][j], dp[i - 1][j - weight] + value) 이 점화식을 이용해 풀면된다. 

for (int i = 1; i <= N; i++)
{
	int weight = W[i];
	int value = V[i];
	for (int j = 1; j <= K; j++)
	{
		dp[i][j] = dp[i - 1][j];

		if (j - weight >= 0)
			dp[i][j] = max(dp[i][j], dp[i - 1][j - weight] + value);
	}
}

전체코드

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int dp[101][100001];
int W[101];
int V[101];
int N, K;

void Input()
{
	cin >> N >> K;
	for (int i = 1; i <= N; i++)
	{
		cin >> W[i] >> V[i];
	}
}

void solve()
{
	for (int i = 1; i <= N; i++)
	{
		int weight = W[i];
		int value = V[i];
		for (int j = 1; j <= K; j++)
		{
			dp[i][j] = dp[i - 1][j];

			if (j - weight >= 0)
				dp[i][j] = max(dp[i][j], dp[i - 1][j - weight] + value);
		}
	}
	cout << dp[N][K];
}

int main()
{
	Input();
	solve();

	return 0;
}

후기

4달전에 풀었던 dp문제인데 다르게 dp 일차원 배열로 풀려다가 머리아파서 그냥 똑같은 방식으로 풀었다. 이게 메모리를 더 많이 잡아먹긴하지만 구현하긴 쉬운것같다.ㅎ

반응형

'알고리즘 문제풀이' 카테고리의 다른 글

백준 11055, 1149  (0) 2020.05.10
백준 16500번 _ 문자열 판별  (0) 2020.05.10
백준 11051번 _ 이항 계수2  (0) 2020.05.09
백준 11057번 _ 오르막 수  (0) 2020.05.09
백준 10844번 _ 쉬운 계단 수  (0) 2020.05.09
Comments