zp1909_p.cpp

来自「浙江大学acm在线判题器代码集。 本人在浙大acm判题器上的所有代码(心血) 」· C++ 代码 · 共 45 行

CPP
45
字号
#include <stdio.h>
#include <string.h>
#include <math.h>

int i,j,k,m,n,N,sum,side,tot;
int s[30];
char d[32*1024*1024];

int doit(int n, int sum, int mask) {
   int i,j,k;
   if (d[mask]) return 0;
   if (sum > side) return 0;
   if (sum == side) sum = 0;
   if (n == m && !sum) return 1;
   d[mask] = 1;
   for (i=0;i<m;i++) {
      if (mask & (1<<i)) continue; // already used
      if (doit(n+1,sum+s[i],mask | (1<<i))) {
         tot += s[i];
         return 1;
      }
   }
   return 0;
}
   

main(){
   scanf("%d",&N);
   while(N--){
      scanf("%d",&m);
      for (i=0;i<m;i++) scanf("%d",&s[i]);
      for (i=sum=0;i<m;i++) sum += s[i];
      side = sum/4;
      if (side * 4 != sum) {
         printf("no\n");
         continue;
      }
      memset(d, 0, 1<<m);

      tot = 0;
      if (doit(0,0,0)) printf("yes\n");
      else printf("no\n");
   }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?