2016-06-21 2 views
0

균형 분할 문제를 this link에서 해결했습니다. 이 질문에서 우리는 합계의 차이가 최소가되도록 같은 부분으로 배열을 나눠야합니다. 그래서, 제가 발견 한 해결책은 모든 요소를 ​​하나의 그룹에 포함할지 여부를 결정하는 것입니다. 그렇지 않으면 2^n 개의 모든 경우를 시도해야합니다.균형 분할 논리를 이해하는 데 어려움이 있습니다

내가 비트 조작을 사용하여 어레이를 나눈 솔루션을 생각해 냈습니다. 로직을 얻지 못했습니다. 아래 코드를 게시하고 있습니다. 누군가 어떻게 배열을 나누는 지 말해 주시겠습니까?

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

void solve(int a[N]) 
{ 
    long long x,y,v1,v2,res,i,j; 
    long long val=1<<N; 
    res=INT_MAX; 
    for(i=0;i<val;i++) 
    { 
     x=y=v1=v2=0; 
     for(j=0;j<N;j++) 
     { 
      if(i & (1<<j)) 
      { 
       x++; 
       v1+=a[j]; 
      } 
      else 
      { 
       y++; 
       v2+=a[j]; 
      } 
     } 
     if(abs(x-y)<=1) res=min(res,abs(v1-v2)); 
    } 
    cout<<res<<endl; 
} 
int main() 
{ 
    int a[] = {23, 45, -34, 12, 0, 98, -99, 4, 189, -1, 4}; 
    solve(a); 
    return 0; 
} 

답변

0

각 cicle의 부분 집합의 처음과 마지막 요소를 요약을 시도 할 수 최적화, 그래서 당신의 부분 집합의 모든 요소 번호 cicling하지만 여러 번 만 cicling 것으로 방지하기 위해의 절반에 해당 내부가 2 diveded있는 동안 서브 세트 크기 ..하여 예에서

는 외부 사이클 반복은 동일하게 유지 :

(for(j=0; j<(N/2); j++) 

및 그룹화 집합 요소의 합 :

,174,
v(1|2)+=(a[j] + a[N-j]);