1 条题解

  • 0
    @ 2023-10-18 10:01:28

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    const int N=70;
    int n;
    int w[N];
    int sum,length;
    bool st[N];
    bool dfs(int u,int cur,int start)
    {
    	if(u*length==sum) return true; //找到答案 
    	if(cur==length) return dfs(u+1,0,0); //新开一组 
    	for(int i=start;i<n;i++) //2.剪枝(排除等效冗余->内部有序)
    	{
    		if(st[i]) continue; //当前木棒已经使用过了 
    		if(cur+w[i]>length) continue; //3.剪枝.可行性剪枝 
    		st[i]=true;
    		if(dfs(u,cur+w[i],i+1)) return true;
    		st[i]=false;
    		if(!cur) return false; //3.剪枝 (第一根失败后面一定失败) 
    		if(cur+w[i]==length) return false;//3.剪枝 (最后一根失败后面一定失败) 
    		int j=i;
    		while(j<n&&w[i]==w[j]) j++;//3.剪枝(排除等效冗余->当前长度一定不可以) 
    		j--;
    		i=j;
    	}
    	return false;
    }
    int main()
    {
    	cin>>n;
    	for(int i=0;i<n;i++)
    	{
    		cin>>w[i];
    		sum+=w[i];
    	}
    	//1.剪枝(优化搜索顺序->按照木棍顺序从大到小开始搜索) 
    	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;
    }
    
    • 1

    信息

    ID
    794
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者