N = 7인 경우에 다음과 같은 상담 일정표를 보자.
1일 2일 3일 4일 5일 6일 7일
Ti 3 5 1 1 2 4 2
Pi 10 20 10 20 15 40 200
1일에 잡혀있는 상담은 총 3일이 걸리며, 상담했을 때 받을 수 있는 금액은 10이다. 5일에 잡혀있는 상담은 총 2일이 걸리며, 받을 수 있는 금액은 15이다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N;
vector<int> timeTable;
vector<int> priceTable;
int search(int day, int profit)
{
if (day > N) {
return profit;
}
int nextDay = day + timeTable[day - 1];
int curProfit = profit;
if (nextDay <= N + 1) curProfit += priceTable[day - 1]; // 상담 진행할 경우 이익
// max(상담을 진행하는 경우, 상담을 진행하지 않는 경우)
return max(search(nextDay, curProfit), search(day + 1, profit));
}
int main()
{
cin.tie(NULL);
ios_base::sync_with_stdio(false);
cin >> N;
for (int day = 1; day <= N; day++) {
int time, price;
cin >> time >> price;
timeTable.push_back(time);
priceTable.push_back(price);
}
cout << search(1, 0) << endl;
}
Leave a comment