关于深度搜索棍子的题

    xiaoxiao2021-03-25  72

    #include<cstdio> #include<cstring> #include<cstdlib> #include <iostream> #include <algorithm> using namespace std; int stick[65],n,sum,num,l; bool mark[65];//标记已经读取过的棍子 bool cmp( int a,int b)//sort的倒序函数 {     return a>b; } bool dfs(int s,int len,int pos)//s:成功组装的棍子;len:当前组成棍子的长度;pos:数组下标 {     int i;     bool sign=(len == 0?true:false);//标记,然后用来剪枝     if (s == num) return true;//终止条件    for ( i = pos+1; i < n; i++)    {        if (mark[i]) continue;//已经用过的棍子不再重复       // printf("%d\n",stick[i]);        if (stick[i]+len==l)        {            mark[i] = true;            if ( dfs(s+1,0,-1))//继续搜索下一步              return true;            mark[i] = false;            return false;        }        else if ( stick[i]+len<l) //若不够继续拿棍子        {            mark[i]= true;         //   printf("\n%d\n\n",stick[i]);            if (dfs(s,len+stick[i],i))//增加棍子继续搜索              return true;            mark[i]=false;            if (sign) return false;            while (stick[i]==stick[i+1]) i++; //剪枝的部分,相同元素再搜没有意义        }    }    return false; } int main() {   int i;   while (scanf("%d",&n),n)   {       sum = 0;       for ( i = 0; i < n; i++)       {           scanf("%d",&stick[i]);           sum+=stick[i];       }       sort (stick,stick+n,cmp);//sort 函数的倒序利用       for ( l = stick[0]; l <= sum; l++)       {             if (sum % l==0)             {                 num = sum/l;                 memset(mark,false,sizeof(mark));                 if (dfs(1,0,-1))//深搜开始                 {                     printf("%d\n",l);                     break;                 }             }       }   } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-19573.html

    最新回复(0)