hud 1518
来源:互联网 发布:刘德福中国网络菜市场 编辑:程序博客网 时间:2024/04/30 12:12
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;int num[30];int vist[30];int T;int n;int sum;int flay;int len;int cmp(int x, int y){ return x > y;}void dfs(int t, int s, int k){ if(t == 4) { flay = 1; return; } if(s == len) { dfs(t+1, 0, 0); if(flay) return; } for(int i = k; i < n; i++) //i 不需要从 0 开始 因为 第一次从零开始的递归程序 会的到我们要的解, { if( vist[i] == 0 && s + num[i] <= len) { vist[i] = 1; dfs(t, s+num[i], i+1); if(flay) return; vist[i] = 0; } }}int main(){ scanf("%d", &T); int maxn = 0; while(T--) { scanf("%d", &n); sum = 0; maxn = 0; memset(vist, 0, sizeof(vist)); for(int i = 0; i < n; i++) { scanf("%d", &num[i]); sum += num[i]; maxn = max(num[i], maxn); } if(sum % 4 != 0) { printf("no\n"); continue; } else if(sum/4 < maxn) { printf("no\n"); continue; } sort(num, num+n, cmp); flay = 0; len = sum/4; dfs(1, 0, 0); if(flay) printf("yes\n"); else printf("no\n"); } return 0;}