F - Separated Lunch Editorial by blueberry1001

再帰関数による実装

再帰関数による実装を示します。

bit全探索は再帰関数でも実装することができます。また、bit全探索は各iに対して0か1の2通りしか試すことができませんが、再帰関数による実装では3通り以上の選択肢に対応することができます。こちらの書き方も知っておくと良いでしょう。

#include<bits/stdc++.h>
using namespace std;

//変数をグローバル宣言しておくことで、関数dfs内で参照できるようにする。
int n,k[20];
long long a,b;
//答えは最大で2×10^9程度になるため、オーバーフローが心配な場合はlong longを使用する。
long long ans;

//再帰関数
void dfs(int pos){
  //N個の部署について割り当てを決め終わったら、答えを更新する。
  if(pos==n){
    ans = min(ans,max(a,b));
    return;
  }
  //pos番目の部署をAに割り当てた場合
  a += k[pos];
  dfs(pos+1);
  a -= k[pos];
  //pos番目の部署をBに割り当てた場合
  b += k[pos];
  dfs(pos+1);
  b -= k[pos];
  return;
}

int main(){
  //入力を受け取る
  cin >> n;
  for(int i = 0;i<n;i++)cin >> k[i];
  //変数を初期化する
  ans = 3000000000;
  a = 0;
  b = 0;
  //再帰関数を呼び出す
  dfs(0);
  cout << ans << endl;
}

提出コード(C++)

posted:
last update: