AOJ - Problem 1045 : Split Up!
数列(a_1, a_2, ... , a_n)をAとBの2つに分け、Aの総和とBの総和の差が最も少ないときの差を求める問題です。動的計画法を使う問題かと思いきやnが20以下と小さいので深さ優先探索(DFS)で全探索してもAcceptすることができるようです。
#include <iostream> #include <cmath> #include <algorithm> using namespace std; int n,ans,a[21]; const int INF = 1e+9; int solve(int i, int A, int B){ if( i == n ){ ans = min( ans , abs(A-B) ); }else{ solve( i+1 , A+a[i] , B ); solve( i+1 , A , B+a[i] ); } } int main(){ while( cin >> n , n ){ for(int i=0 ; i < n ; i++ ){ cin >> a[i]; } ans = INF; solve( 0 , 0 , 0 ); cout << ans << endl; } }