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;
}
posted:
last update: