문제
11052번: 카드 구매하기
풀이
- 그냥 완전 탐색에 메모이제이션 추가된 느낌
- n 개의 카드팩을 사는데 최대로 드는 비용을 dp에 저장
- 실제로 모든 경우를 다 사보는데 만약에 이미 사본경우가 있으면 저장해둔 값 쓴다.
- 이떄 n 이 음수가 되면 안되기떄문에
if (num - i >= 0)
조건문을 걸어준다.
- 아니면
if (num < 0) return (-999999)
이런식도 가능하다.
구현
#include <iostream>
#include <vector>
#include <set>
using namespace std;
int n;
vector<int> cards;
vector<int> dp;
void pre() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
}
void input() {
cin >> n;
cards.resize(n + 1);
dp.resize(n + 1);
for(int i = 1; i <= n; i++)
cin >> cards[i];
}
int rec(int num) {
int price;
price = 0;
if (num == 0)
return (0);
if (dp[num])
return (dp[num]);
for(int i = 1; i <= n; i++)
if (num - i >= 0)
price = max(rec(num - i) + cards[i], price);
dp[num] = price;
return (dp[num]);
}
void solve() {
cout << rec(n) << endl;
}
int main() {
input();
solve();
return (0);
}