https://www.acmicpc.net/problem/12865
1. 불가능한경우를 먼저 ret하라
int dfs(int idx, int weight) {
//기저사례
//!조건불만족하면 리턴! 이 return이 먼저와야함!! -> 그래야 배제가능.
// 안그러면, 조건불만족 인데 idx==n인 경우도 유효한 경우로 카운팅됨.
if (weight > k) {
return -987654321;
}
if (idx == n) {
return 0;
}
idx==n return 0이 먼저오는 경우 : 조건불만족인데 n에 도달한경우도 유효한 경로로 카운팅이 되어버린다..
2. 의사코드
0 번베낭을 담는다, 안담는다
1번 베낭을 담는다 안담는다 ... 로 완탐하고
dp[idx][weight] 의 상태를 배열에 저장해놓는다.
3. 전체코드
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int n, k,dp[104][100000+4],w[104],v[104];
int dfs(int idx, int weight) {
//기저사례
//!조건불만족하면 리턴! 이 return이 먼저와야함!! -> 그래야 배제가능.
// 안그러면, 조건불만족 인데 idx==n인 경우도 유효한 경우로 카운팅됨.
if (weight > k) {
return -987654321;
}
if (idx == n) {
return 0;
}
if (dp[idx][weight] != -1) return dp[idx][weight];
dp[idx][weight] = 0;
//이번베낭을 안담는경우, 담는경우
dp[idx][weight] = max(dfs(idx+1,weight),dfs(idx+1,weight+w[idx])+v[idx]);
return dp[idx][weight];
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
memset(dp, -1, sizeof(dp));
cin >> n>>k;
for (int i = 0; i < n; ++i) {
int a, b;
cin >> a>>b;
w[i] = a;
v[i] = b;
}
//0번 가방을 담는경우, 안담는경우로 시작
cout << dfs(0, 0);
return 0;
}
'Algorithm > dp' 카테고리의 다른 글
백준 17070 파이프옮기기 1,2 c++ // 재귀dp (0) | 2024.04.29 |
---|---|
백준 1149 RGB거리 c++ // 재귀dp, 추가정보 필요시 해결방법 (0) | 2024.04.28 |
백준 2098 외판원순회 c++ // 상태 비트기반 dp, 비트마스킹, 비트 1111 만드는법 (0) | 2024.04.27 |
백준 15486 퇴사2 c++ // 탑다운디피, 재귀디피, 맨뒤에서오는 노드그림을 떠올려라! (0) | 2024.04.26 |
백준 2240 자두나무 c++ // 탑다운디피, 재귀디피 형식, 비트연산자, memset사용법 (0) | 2024.04.26 |