Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
高手帮我看下,也是什么bt数据都通过了,但还是WA.是不是我忽略了什么还是漏掉了什么呢?/* 这是一道典型DFS+剪枝的经典题,推荐大家都去做做。 本题大概意思就是:有n数,分成若干若干组,每组合都应为lg,求lg的最小值。 */ #include<stdio.h> #include<stdlib.h> #include<string.h> #define N 10000 int array[N],assis[N],x[N]; int result=0,mark=0; int GD(int n) { int i,k=1; for(i=0;i<mark;i++) { if(assis[i]==n)k=0; } return k; } int DFS(int num,int length,int m) { int i,j,t,k=0; int temp=0,count=0; //printf("m=%d\n",m); if(m>=length)return 1; else for(i=0;i<length;i++) { if(!x[i]) { temp=array[i];x[i]=1;if(temp==num && i==0)k=1; for(j=i+1;j<length;j++) { if(!x[j]) { temp+=array[j];x[j]=1; if(temp==num) { for(t=0;t<length;t++)if(x[t])count++; //for(t=0;t<length;t++)printf("t=%d,x[%d]=%d ",t,t,x[t]);system("PAUSE"); k=DFS(num,length,m+count);if(k)break; } else if(temp>num) { temp -= array[j];x[j]=0; } } } } if(k)break; if(!k && !m){for(t=0;t<length;t++)x[t]=0;count=0;} } return k; } void sort(int n) { int i,j,temp; for(i=0;i<n;i++) { for(j=i+1;j<n;j++) { if(array[i]<array[j]){temp=array[i];array[i]=array[j];array[j]=temp;} } } } int test(int num,int n) { int i,k=1,t=0; for(i=0;i<n;i++) { if(num==array[i])t++; } if(t==n)k=0; return k; } int main() { int i,n; while(1) { scanf("%d",&n); if(n==0)break; if(n==1) { int t=0; scanf("%d",&t); printf("%d\n",t); } else { int temp=0; for(i=0;i<n;i++) { scanf("%d",&array[i]); result+=array[i]; } sort(n); //for(i=0;i<n;i++)printf("%d ",array[i]);printf("\n"); temp=array[0]; if(!test(temp,n))printf("%d\n",temp); else { for(i=2;i<=result;i++) { if(result%i==0 && GD(i) && i>temp)assis[mark++]=i; } if(mark<=1) { mark=0; for(i=2;i<result;i++) { if(result%i==0 && GD(i))assis[mark++]=i; } } //for(i=0;i<mark;i++)printf("%d ",assis[i]);printf("\n"); for(i=0;i<mark;i++) { if(DFS(assis[i],n,0)){printf("%d\n",assis[i]);break;} else memset(x,0,sizeof(int)*n); } } memset(assis,0,sizeof(int)*mark); memset(array,0,sizeof(int)*n); memset(x,0,sizeof(int)*n); result=mark=0; } } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator