반응형
포인트
1. 완전탐색 방법과 다이나믹 방법이 있다.
2. 완전 탐색 방법은 재귀를 통해서 구한다.
🧶문서는 항상 수정 될 수 있습니다. 비판은 환영합니다.
브루트포스
#include <iostream>
using namespace std;
int n;
int time[16];
int cost[16];
int value = 0;
void go(int index, int v) {
if (index > n) return; // 조건을 넘을 떄
if (index == n) { // 조건을 만족할 때
value = max(value, v);
return;
}
go(index + time[index], v + cost[index]); //상담을 할 때
go(index + 1, v); // 상담을 안하고 넘어갈때
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> time[i] >> cost[i];
}
go(0, 0);
cout << value << '\n';
return 0;
}
다이나믹
#include <iostream>
#include <algorithm>
using namespace std;
int d[16];
int time[16];
int cost[16];
int n;
//dp의 경우
int go(int day) {
if (day == n + 1) return 0;
//날짜가 n+1보다 크다면 -값을 크게 준다.
if (day > n + 1) return -987654321;
//메모이제이션
if (d[day] > 0) return d[day];
//점화식 상담을 안한다 혹은 상담을 한다. 둘 중 하나를 고른다.
return d[day] = max(go(day + 1), go(day + time[day]) + cost[day]); //재귀가 들어감
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++)
cin >> time[i] >> cost[i];
// 입력을 하는 부분
cout << go(1) << "\n";
return 0;
}
2021 03 07 수정
import sys
sys.stdin = open('input.txt')
def go(index: int, val: int):
global max_value
if index == n:
max_value = max(max_value, val)
return
if index >= n:
return
go(index + data[index][0], val + data[index][1])
go(index + 1, val)
n = int(input())
data = []
for _ in range(n):
a, b = map(int, input().split())
data.append([a, b])
max_value = 0
go(0, 0)
print(max_value)
반응형
'알고리즘' 카테고리의 다른 글
[알고리즘] c++ cpp 다리 만들기 (0) | 2020.10.17 |
---|---|
[알고리즘] c++ cpp 봄버맨 (0) | 2020.10.16 |
[알고리즘] 2048 (Easy) (0) | 2020.10.15 |
[알고리즘] cpp c++ 다리 만들기2 (0) | 2020.10.14 |
[알고리즘] 낚시왕 (0) | 2020.10.14 |
댓글