[BOJ] 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