求助大佬!为什么这样评测出来是错的?!
查看原帖
求助大佬!为什么这样评测出来是错的?!
290406
MaoMaoNB楼主2020/12/29 17:25
#include<bits/stdc++.h>
using namespace std;
int num[200],used[200];
int n,lim=-1,sum=0,len,flag=0,maxn;
bool cmp(int x,int y){return x>y;}
void dfs(int k,int last,int lenth)//k是在搞第几根木棍,last是上一根木棍是第几根(剪枝用),lenth是这根木棍剩余的长度 
{
	if(k==maxn){
		flag=1;return;
	}
	if(lenth==0){
		int j;
		for(int i=1;i<=n;i++)
		{
			if(!used[i]){
				used[i]=1;j=i;break;
			}
		}
		dfs(k+1,j,len-num[j]);
	}
	for(int i=last+1;i<=n;i++)//已经排过序了,前面用不了的肯定还是用不了,剪!
	 if(!used[i]&&num[i]<=lenth)
	 {
		used[i]=1;
		dfs(k,i,lenth-num[i]);
		used[i]=0;//回溯 
	 } 
}
int main()
{
	cin>>n;
	while(n!=0)
	{
		lim=-1,sum=0;
		for(int i=1;i<=n;i++)
		{
			cin>>num[i];
			lim=max(lim,num[i]);
			sum+=num[i];
		}
		sort(num+1,num+n+1,cmp);//改变顺序,这个很重要,小的比大的有用,所以先塞大的后补小的 
		for(int i=lim;i<=sum;i++)
		{
			if(sum%i==0)
			{
				flag=0;
				memset(used,0,sizeof(used));
				len=i;
				used[1]=1;
				maxn=sum/i;
				dfs(1,1,len-num[i]);
				if(flag)
				{
					cout<<len<<endl;
					break;
				}
			}
		}
		cin>>n;
	}
	return 0;
}
2020/12/29 17:25
加载中...