#define _USE_MATH_DEFINES #include #include #include #include #include #include //#include #include #include #include #include #include #include ///////// #define REP(i, x, n) for(int i = x; i < n; i++) #define rep(i,n) REP(i,0,n) #define P(p) cout<<(p)< ///////// typedef long long LL; typedef long double LD; ///////// using namespace::std; ///////// int N; LL tot; LL A[31]; //vector> hlaf(1<<16); //priority_queue,vector>,greater> > pq; vector< pair > Hdata; priority_queue< pair > pq; void solveH(LL sum,int n,int bit){ if( n >= N ){ Hdata.push_back( pair(sum,bit) ); //pq.push( pair(sum,bit) ); }else{ solveH( sum + A[n],n+1,bit+(1<<(n-N/2)) ); solveH( sum,n+1, bit); } return; } void solve(LL sum,int n,int bit){ if( n >= N/2 ){ //check vector< pair >::iterator it; it = lower_bound(Hdata.begin(),Hdata.end(),pair(tot-sum,0) ); int tbit; bool flag = false; while( it != Hdata.end() && it->first == tot-sum ){ tbit = bit; flag = false; rep(i,N/2){ if( tbit % 2 ){ cout << i + 1; flag = true; } tbit = tbit >> 1; if( tbit && flag ){ cout << " "; flag = false; }else if( tbit == 0 ){ break; } } tbit = it->second; if( flag && tbit ){ cout << " "; } flag = false; for(int i=N/2;i> 1; if( tbit && flag ){ cout << " "; flag = false; }else if( tbit == 0 ){ break; } } cout << endl; ++it; } return; } if( sum + A[n] == tot){ int tbit; bool flag = false; tbit = bit + (1<> 1; if( tbit && flag ){ cout << " "; flag = false; }else if( tbit == 0 ){ cout << endl; break; } } }else if( sum + A[n] < tot){ solve( sum + A[n],n+1,bit+(1<>N>>tot; rep(i,N){ cin>>A[i]; } Hdata.reserve( ( 1<<(N/2) ) -1 ); solveH(0,N/2,0); //priority_queue> test( Hdata.begin() , Hdata.end() ); //pq = priority_queue>( Hdata.begin() , Hdata.end() ); sort( Hdata.begin(), Hdata.end() ); solve(0,0,0); return 0; }