zoukankan      html  css  js  c++  java
  • 木棒(深搜 剪枝)

    乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位。

    然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。

    请你设计一个程序,帮助乔治计算木棒的可能最小长度。

    每一节木棍的长度都用大于零的整数表示。

    输入格式
    输入包含多组数据,每组数据包括两行。

    第一行是一个不超过64的整数,表示砍断之后共有多少节木棍。

    第二行是截断以后,所得到的各节木棍的长度。

    在最后一组数据之后,是一个零。

    输出格式
    为每组数据,分别输出原始木棒的可能最小长度,每组数据占一行。

    数据范围
    数据保证每一节木棍的长度均不大于50。

    输入样例:
    9
    5 2 1 5 2 1 5 2 1
    4
    1 2 3 4
    0
    输出样例:
    6
    5

    #include <iostream>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    const int N = 100;
    bool state[N];
    int w[N];
    int sum;
    int n;
    int length ;
    bool dfs(int u ,int s , int start)
    {
        if(u * length == sum)return true;
        if(s == length) return dfs(u+1,0,0);
        
        for(int i = start ; i < n ; i ++)
        {
            
            if(s + w[i] > length) continue;
            if(state[i])continue;
            if(!state[i])
            {
                state[i] = true;
                if(dfs(u,s+w[i], i +1)) return true;;
                state[i] = false;
            }
                
        if(!s) return false;//第一个木棍失败回溯 长度为0  后面的都失败
        
        if(s + w[i] == length) return false; // 最后一个木棍失败
         int j = i;
        while(  j < n && w[i] == w[j] ) j ++;//相同木棍失败 
        i = j-1;
    
        }
        
        
    
        
        return false;
        
    }
    
    
    int main()
    {
      while(cin >> n , n)
      {
          memset(state,0,sizeof state);
          sum = 0;
          for(int i =0 ; i < n ; i ++)
          {
              cin >> w[i];
              sum +=w[i];
              }
              sort(w,w+n);
              reverse(w,w+n);//搜索剪枝
              
             length = 1;//枚举大棍长度
            
            while(true)
            {
                if(sum % length == 0 && dfs(0,0,0))//可行性剪枝
                {
                    cout << length<<endl;
                    break;
                }
                length++;
            }
             
      }
      return 0;
    }
    
    
  • 相关阅读:
    Silverlight:拖动滚动条控制媒体播放
    黑马程序员第一阶段3.面向对象第5天
    黑马程序员第一阶段2.java编程基础第4天
    黑马程序员第一阶段2.java编程基础第2天
    黑马程序员第一阶段2.java编程基础第3天
    黑马程序员第一阶段3.面向对象第6天
    黑马程序员第一阶段3.面向对象第8天
    黑马程序员第一阶段3.面向对象第7天
    黑马程序员第一阶段1.Java开发前奏第1天
    hdu 1133
  • 原文地址:https://www.cnblogs.com/wk-love-zsy/p/14174457.html
Copyright © 2011-2022 走看看