(普及二)2.小木棍(WA30,附错误样例,但在本地可过

#include<bits/stdc++.h>
using namespace std;
int n,a[105],v[105]={0};//v[]表示该条是否拼过
int len,sum=0,m;//len为每段长度 ,m为能拼成的根数 
bool cmp(int x,int y){
	return x>y;
} 
bool dfs(int k,int now,int d){//k为已完成根数,now为当前编号,为当前木条所完成的 长度 
	if(k==m){return true;} //目标完成 
	if(d==len){//已经完成一个,开启下一个 
		for(int i=1;i<=n;i++){
			if(!v[i]) {
				v[i]=1;
				return dfs(k+1,i,a[i]);
				break; 
			}
		}
	}

	for(int i=now+1;i<=n;i++){
		if(!v[i]&&d+a[i]<=len){//这根可用 
			v[i]=1;//标记用过 
			if(!dfs(k,i,d+a[i])){
				v[i]=0;//回溯 
				int j=i;
				while(a[j]==a[i]&&i<n) i++;//相同直接跳过 
			}
		}
	}
	if(now==n&&d<len){return false;}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		sum+=a[i];
	}
	sort(a+1,a+n+1,cmp);
	len=a[1];
	for(len;len<=sum/2;len++){
		if(sum%len==0){ 
            memset(v,0,sizeof(v));
			m=sum/len;
			v[1]=1;
			 if(dfs(0,1,a[1])) {
			 	cout<<len;
				 return 0; 
			 }
		}
	}
	cout<<sum;
	return 0;
}
/*
60
5 6 6 5 2 8 7 8 2 5 8 6 3 1 4 8 6 5 5 7 2 4 3 3 1 1 5 4 5 1 1 1 8 4 3 3 5 3 8 1 2 8 7 2 2 8 4 4 5 2 4 8 6 4 8 2 8 1 1 1

10

WA
*/
60
5 6 6 5 2 8 7 8 2 5 8 6 3 1 4 8 6 5 5 7 2 4 3 3 1 1 5 4 5 1 1 1 8 4 3 3 5 3 8 1 2 8 7 2 2 8 4 4 5 2 4 8 6 4 8 2 8 1 1 1

10

WA

大概是return的问题

3 个赞

是的,bool怎么能不return?

3 个赞

加一个return falce

3 个赞

有了不过还是有问题的

4 个赞

不要把第一个直接放到长度里,怪怪的。
另外重新开始一个k时,应该重新从首个木棍开始

4 个赞

是过不了,
正确的输出 | 您的输出(对比左边)
403 | 62
正确的输出 | 您的输出(对比左边)
96 / 51
正确的输出 | 您的输出(对比左边)
195 / 65

2 个赞