문제 : https://www.acmicpc.net/problem/12865


[ 알고리즘풀이 ]

DP 문제입니다.

DP[K] : 무게를 K만큼 사용했을 때, 담을 수 있는 최대 가치. 라고 정의합니다.

1 ~ N 개의 물건을 차례대로 순회하며 DP 배열을 채우면 O(N * K) 만에 문제를 해결할 수 있습니다.

DP 배열 정의하는 것보다는 물건을 기준으로 배열을 채우는게 문제 풀이의 핵심인 것 같습니다. ( 같은 물건을 2번 사용하지 않을 수 있다. )

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int dp[100001] = {};

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	int N, K, w, v;
	vector<pair<int, int>> list; // 무게와 가치
	list.push_back(make_pair(1, 1));

	cin >> N >> K;
	for (int i = 0; i < N; i++) {
		cin >> w >> v;
		list.push_back(make_pair(w, v));
	}

	for (int i = 1; i <= N; i++) {
		for (int j = K; j >= 1; j--) {
			if (list[i].first <= j) {
				dp[j] = max(dp[j], dp[j - list[i].first] + list[i].second);
			}
		}
	}
	
	cout << dp[K];
	
}

 

+ Recent posts