• 【HDOJ】1518 Square


    DFS+剪枝。与HDOJ 1455如出一辙。

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4 
     5 #define MAXN 25
     6 
     7 int nums[MAXN], n, len, cnt;
     8 char visit[MAXN];
     9 
    10 int comp(const void *a, const void *b) {
    11     return *(int *)b - *(int *)a;
    12 }
    13 
    14 int dfs(int cnt, int beg, int l) {
    15     int i, flg = 0;
    16     if (cnt == 3)
    17         return 1;
    18     if (l == 0) {
    19         for (i=0; i<n; ++i) {
    20             if ( !visit[i] ) {
    21                 visit[i] = 1;
    22                 flg = dfs(cnt+1, i+1, len-nums[i]);
    23                 visit[i] = 0;
    24                 break;
    25             }
    26         }
    27         return flg;
    28     }
    29 
    30     for (i=beg; i<n; ++i) {
    31         if ( !visit[i] ) {
    32             if (i && !visit[i-1] && nums[i] == nums[i-1])
    33                 continue;
    34             if (nums[i] <= l) {
    35                 visit[i] = 1;
    36                 flg = dfs(cnt, i+1, l-nums[i]);
    37                 visit[i] = 0;
    38                 if (flg) return 1;
    39             }
    40         }
    41     }
    42 
    43     return 0;
    44 }
    45 
    46 int main() {
    47     int case_n, sum;
    48     int i, j;
    49 
    50     scanf("%d", &case_n);
    51 
    52     while (case_n--) {
    53         scanf("%d", &n);
    54         sum = 0;
    55         for (i=0; i<n; ++i) {
    56             scanf("%d", &nums[i]);
    57             sum += nums[i];
    58         }
    59         if ( sum&3 )
    60             printf("no
    ");
    61         else {
    62             len = sum>>2;
    63             qsort(nums, n, sizeof(int), comp);
    64             memset(visit, 0, sizeof(visit));
    65             j = 1;
    66             for (i=0; i<n; ++i)
    67                 if (nums[i] > len) {
    68                     j = 0;
    69                     break;
    70                 }
    71             if (!j)
    72                 printf("no
    ");
    73             else if ( dfs(0, 0, len) )
    74                 printf("yes
    ");
    75             else
    76                 printf("no
    ");
    77         }
    78     }
    79 
    80     return 0;
    81 }
  • 相关阅读:
    最受欢迎的北大通选课导读·1[精品]
    社会保险,
    养老金的计算,
    毫秒 后的一个计算,
    返回格式 的数据结构再次改造,
    阶段状态池子,
    生活,-摘
    融合,
    tableview 也可以实现这个效果,
    字体大小 一致起来,
  • 原文地址:https://www.cnblogs.com/bombe1013/p/3770560.html
Copyright © 2020-2023  润新知