zoj 1909 Square

  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. int  len[20];
  5. int  average;
  6. int  n;
  7. int  occ[20];
  8. bool formSquare(int i, int j, int  amount)
  9. {
  10.     if (amount < 0 || j < 0) return false;
  11.     if (amount == 0) {
  12.         if (i==2) return true;
  13.         return formSquare(i+1, n-1, average);
  14.     }
  15.     
  16.     if (!occ[j])
  17.     {
  18.         occ[j] = 1;
  19.         if (formSquare(i, j-1, amount - len[j]) ) return true;
  20.         occ[j] = 0;
  21.         while (j && len[j] == len[j-1]) j--;
  22.     }
  23.     return formSquare(i, j-1, amount);
  24. }
  25. int main()
  26. {
  27.     int k;
  28.     cin>>k;
  29.     for (int i=0; i<k; i++)
  30.     {
  31.         cin>>n;
  32.         average = 0;
  33.         for (int j=0; j<n; j++)
  34.         {
  35.             cin>>len[j];
  36.             average += len[j];
  37.         }
  38.         if (average%4) {
  39.             cout<<"no"<<endl;
  40.             continue;
  41.         }
  42.         
  43.         sort(len, len+n);
  44.         average >>= 2;
  45.         if (len[n-1] > average)
  46.         {
  47.             cout<<"no"<<endl;
  48.             continue;
  49.         }
  50.         for (int j=0; j<n; j++) occ[j] = 0;
  51.         bool done = formSquare(0, n-1, average);
  52.         if (done) cout<<"yes"<<endl;
  53.         else cout<<"no"<<endl;
  54.     }
  55. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值