백준 12865 - 평범한 배낭
생각 및 접근
- 전형적인 냅색 알고리즘이다.
dp[i]
- 현재 배낭의 무게가 i일 때의 최대 가치를 저장
- 배낭에 넣을 수 있는 물건이 중복되지 않으므로, j-for문을 역순으로 체킹하면 중복 없이 확인할 수 있다.
for(int j = k; j >= w; j--){ dp[j] = max(dp[j], dp[j - w] + v); }
k
는 가방의 제한 무게,w
는 현재 검사하려는 물건의 무게,v
는 현재 검사하려는 물건의 가치- j-for문
- j를 k부터 w까지 돌린다. j가 w보다 작은 값을 도는 것은 의미가 없다. 현재 검사하려는 물건의 무게가 w이므로, w 미만의 가방 무게에는 검사하려는 물건이 들어갈 수 없다.
dp[j]
와dp[j - w] + v
중 큰 값으로dp[j]
를 업데이트 한다.
코드
#include <bits/stdc++.h>
using namespace std;
int n, k, w, v, dp[100001];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> n >> k;
for(int i = 1; i <= n; i++){
cin >> w >> v;
for(int j = k; j >= w; j--){
dp[j] = max(dp[j], dp[j - w] + v);
}
}
cout << dp[k];
}
채점 결과
'Coding Test > acmicpc' 카테고리의 다른 글
백준 1904 - 01타일 (c++) (0) | 2020.08.19 |
---|---|
백준 1699 - 제곱수의 합 (c++) (0) | 2020.08.16 |
백준 1149 - RGB거리 (c++) (0) | 2020.08.15 |
백준 15989 - 1, 2, 3 더하기 4 (c++) (0) | 2020.08.12 |
백준 1890 - 점프 (c++) (0) | 2020.08.10 |