[BOJ] 12865 : 평범한 배낭

12865 : 평범한 배낭

풀이

0-1 knapsack 문제

DP로 해결할 수 있는 유명한 문제.

참고자료없이 풀어보았다.

코드

다이나믹프로그래밍

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <map>
#include <stack>
using namespace std;

int arr[101][100001];

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	//O(n*k) : 1천만
	int n, k;
	cin >> n >> k;
	for (int i = 1; i <= n; i++) {
		int w, v;
		cin >> w >> v;
		for (int j = 1; j <= k; j++) {
			if (j >= w) {
				//(현재꺼가치 + 넣고남는공간최대가치)와 기존가치를 비교
				if (v + arr[i-1][j-w] >= arr[i-1][j]) {
					arr[i][j] = v + arr[i - 1][j - w];
				}
				else {
					arr[i][j] = arr[i - 1][j];
				}
			}
			else {
				arr[i][j] = arr[i - 1][j];
			}
		}
	}

	cout << arr[n][k];

	return 0;
}

참고

i\j  0  1  2  3  4  5  6  7  8  9  10
0    0  0  0  0  7  7  7  7  7  7  7
1    0  0  0  0  7  7  13 13 13 13 20
Written on June 29, 2021