zoukankan      html  css  js  c++  java
  • 小木棒HDU1455(DFS+剪枝)

    题意:HDU1455

    给出n个小木棒的长度,他们是又数根长度相同的木棒剪短得来的,问没剪短之前的木棒长度最短是多少.

    思路:

    见代码:https://www.cnblogs.com/fqfzs/p/9911110.html参考自

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn = 70;
     4 const int INF = 0x3f3f3f3f;
     5 int n, sumv, target, aim;//target表示目标的棍子个数,aim表示目标的棍子长度,sumv为所有木棍总长度 
     6 int stick[maxn], vis[maxn];//vis数组标记 ,stick存储输入的木棒长度 
     7 bool cmp(int a, int b) {
     8     return a > b;
     9 }
    10 bool dfs(int cnt, int len, int pos) {
    11     if(cnt == target) return true;//根数对上就返回 退出dfs
    12     if(len == aim) return dfs(cnt+1, 0, 0); //当拼完一根后,继续拼下一根
    13     for(int i = pos; i < n; i++) {//从大到小排序后,按顺序搜索
    14         if(!vis[i] && len+stick[i] <= aim) {
    15             vis[i] = 1;
    16             if(dfs(cnt, len+stick[i], i+1)) return true;
    17             vis[i] = 0;                         //只有失败才会运行到下面,否则是直接返回的
    18             if(len == 0) return false;                     //如果第一根时失败  剪枝
    19             while(i+1 < n && stick[i+1] == stick[i]) i++;  //如果下一根长度跟当前的失败的长度一样,剪枝
    20         }
    21     }
    22     return false;
    23 }
    24 int main() {
    25     while(~scanf("%d", &n), n) {
    26         sumv = 0;
    27         for(int i = 0; i < n; i++) {
    28             scanf("%d",&stick[i]);
    29             sumv += stick[i];
    30         }
    31         sort(stick, stick+n, cmp);
    32         int ans = 0;
    33         for(int i = stick[0]; i <= sumv; i++) {//拼好后的木棒长度只会在stick[0]和总长度之间 
    34             if(sumv % i == 0) {
    35                 memset(vis, 0, sizeof(vis));
    36                 aim = i;
    37                 target = sumv / aim;
    38                 if(dfs(0, 0, 0)) {
    39                     ans = aim;
    40                     break;
    41                 }
    42             }
    43         }
    44         printf("%d
    ",ans);
    45     }
    46     return 0;
    47 }
  • 相关阅读:
    poj 3264(RMQ或者线段树)
    LCA上的RMQ模板算法
    LCA离线算法Tarjan的模板
    poj 1330(初探LCA)
    hdu 3367(与最大生成树无关。无关。无关。重要的事情说三遍+kruskal变形)
    hdu 4496(并查集逆向添边)
    hdu 1829(继续扩展并查集)
    poj 1182 (扩展并查集)
    hdu 3038(扩展并查集)
    hdu 3371(kruskal)
  • 原文地址:https://www.cnblogs.com/--HPY-7m/p/11992028.html
Copyright © 2011-2022 走看看