[BOJ]14501号退社c++


https://www.acmicpc.net/problem/14501


質問する
コンサルタントの白俊さんが会社を辞めます.
今日からN+1日で辞めるために、残りのN日にできるだけ多くの相談をします.
白俊は秘書にできるだけ多くの相談を依頼し、秘書は1日に1回異なる人に相談を手配した.
各コンサルティングは,コンサルティングを完了するのに要する時間内にTIとコンサルティングを行う際に得られる金額Piからなる.
N=7の場合は、以下のコンサルティングスケジュールを参照してください.
-1日2日3日4日5日6日7日
1日のカウンセリングは全部で3日かかりますが、カウンセリング時にもらえる金額は10です.5日間のお問い合わせは2日間かかりますが、受け付けられる金額は15です.
相談にかかる時間は1日以上かかる場合がありますので、すべての相談はできません.例えば、1日に問い合わせを行った場合、2日、3日に問い合わせをすることはできません.2日に問い合わせをすれば、3、4、5、6日には問い合わせができない.
なお、N+1日は会社にいないため、6,7日は相談できません.
退職前にカウンセリングを行う最大の利益は1日、4日、5日にカウンセリングを行うことであり、その際の利益は10+20+15=45である.
商談がうまくいけば、白俊に最大の収益をもたらす計画を立ててください.
入力します.
7
3 10
5 20
1 10
1 20
2 15
4 40
2 200
出力します.
45
入力します.
10
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
出力します.
55
入力3
10
5 10
5 9
5 8
5 7
5 6
5 10
5 9
5 8
5 7
5 6
出力します.
20
入力4
10
5 50
4 40
3 30
2 20
1 10
1 10
2 20
3 30
4 40
5 50
出力します.
90
#include <iostream>
#include <cstdio>

using namespace std;

int N;
int arr[16][2];
int benefit = 0;

void dfs(int x, int b) {
  if(x > N)
    return;

  for(int i = x; i <= N; i++) {
    if(i + arr[i][0] - 1 <= N) {
      benefit = max(benefit, b + arr[i][1]);
      dfs(i + arr[i][0], b + arr[i][1]);
    }
  }
}

int main() {
  scanf("%d", &N);
  for(int i = 1; i <= N; i++)
    scanf("%d %d", &arr[i][0], &arr[i][1]);

  for(int i = 1; i <= N; i++) {
    if(i + arr[i][0] - 1 <= N) {
      benefit = max(benefit, arr[i][1]);
      dfs(i + arr[i][0], arr[i][1]);
    }
  }
  printf("%d\n", benefit);
}
問題自体はDPに分類されるが,15の大きさは大きくなくDFSを用いることができる.