首页 > 其他分享 >木棒

木棒

时间:2023-03-21 20:00:41浏览次数:35  
标签:return 木棒 dfs st int len false

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;

const int N=70;

int n;
int w[N];
int sum;
bool st[N];
int len;
//dfs 蹦着跳着选择哪一根木棍的写法
//用st[]数组,传一个start
bool dfs(int u,int s,int start)
{
    if(u*len==sum) return true;
    if(s==len) return dfs(u+1,0,0);
    
    for(int i=start;i<n;i++)
    {
        if(st[i]) continue;//被遍历过
        if(s+w[i]>len) continue;
        
        st[i]=true;
        if(dfs(u,s+w[i],start+1)) return true;
        st[i]=false;
        if(!s) return false;//在当前大棍放的第一个木棍失败
        if(s+w[i]==len) return false;//如果+w[i]后==len,表示这根木棒的拼接是成功的,但仍然返回了false,就证明后面的木棍没有匹配成功,所以这个方案错误
        int j=i;//失败,则把与失败那根长度相同的木棍都略过
        while(j<n&&w[j]==w[i]) j++;
        i=j-1;
    }
    
    return false;
}
int main()
{
    while(cin>>n,n)
    {
        sum=0;
        memset(st,0,sizeof st);
        for(int i=0;i<n;i++)
        {
            cin>>w[i];
            sum+=w[i];
        }
        sort(w,w+n);
        reverse(w,w+n);
        len=1;
        while(true)
        {
            if(sum%len==0&&dfs(0,0,0))
            {
                printf("%d\n",len);
                break;
            }
            len++;
        }
    }
    return 0;
}

 

标签:return,木棒,dfs,st,int,len,false
From: https://www.cnblogs.com/tolter/p/17241237.html

相关文章

  • C++算法之旅、02 从木棒切割问题领悟二分法精髓
    172、木棒切割问题https://sunnywhy.com/problem/172题目描述给出n根木棒的长度,现在希望通过切割它们来得到至少k段长度相等的木棒(长度必须是整数),问这些长度相等的木......
  • 木棒
    https://www.acwing.com/problem/content/169/#include<cstring>#include<iostream>#include<algorithm>usingnamespacestd;constintN=70;intn;intw[......
  • [AcWing 167] 木棒
    DFS剪枝点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;constintN=1e6+10;intn;intw[N];intsum,len;boolst......