2014-12-26 2 views
-9

dec 긴 컨테스트 (codechef)의 질문 - http://www.codechef.com/problems/SANSKAR, diff 가중치가있는 n 엔티티가 주어진 부분에서 나누어 질 수 있는지, 각 부분의 무게가 같은지 여부 만 알면됩니다. 나는 AC를 얻지 못해 해결책을 찾지 못했다. - http://ideone.com/3hB8lI, 이 솔루션은 문제를 단순화하기 위해 비트 연산을 사용하지만 비트 연산은 알고 있지만이 솔루션에서 사용 된 접근법을 얻을 수 없다. odrs 코드를 복사하는 것이 내가 비트 작전이 답을 얻을 수있는 솔루션에 사용하는 방법을 알고 싶어하지만, 좋은 생각 ..비트 연산의 사용법을 이해하지 못합니다.

#include<stdio.h> 
int main() { 
    int T, N, K; 
    scanf("%d", &T); 
    while(T--) { 
     scanf("%d %d", &N, &K); 
     long long a[N]; 
     for(int i=0; i<N; i++) 
      scanf("%lld", &a[i]); 
     long long totSans=0; 
     for(int i=0; i<N; i++) 
      totSans+=a[i]; 
     long long eachSans; 
     if(N<K || totSans%K) { 
      printf("no\n"); 
      continue; 
     } 
     if(totSans%K==0) 
      eachSans=totSans/K; 
     long long takeAll=0; 
     int cnt=0; 
     for(int i=0; i<(1<<N); i++) { 
      long long sum=0; 
      for(int j=0; j<N; j++) 
       if(i & (1<<j)) 
        sum+=a[j]; 
      if(sum==eachSans && !(i & takeAll)) { 
       takeAll |= i; 
       cnt++; 
      } 
     } 
     printf(!totSans || cnt>=K ? "yes\n" : "no\n"); 
    } 
} 
+1

전체 코드를 붙여 넣을 필요는 없습니다. 관련 비트만 제공해주세요. 또한, [mcve] (http://stackoverflow.com/help/mcve). – Pradhan

+0

들여 쓰기가 어디에 있습니까? – martijnn2008

+0

코드에서 martijnn2008 –

답변

0

for(int i=0; i<(1<<N); i++)은 조합을하는 데 사용됩니다 는 루프 0b00000에서

0b11111에 다음 코드 :

long long sum=0; 
for(int j=0; j<N; j++) 
    if(i & (1<<j)) 
     sum+=a[j]; 
} 

에 따라 합계가 i == 0b1010이므로 합계는 a[1] + a[3] (마스크 색인은 오른쪽부터 시작 함)입니다.

관련 문제