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 |
尼玛,什么情况,uva上AC了,POJ上一直TLE,虽然我的dfs代码跟主流的DFS搜法有点不同。。。。。。。。。。。。求解释。。#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int num[80],n,vis[80],noexit[80],flag; bool cmp(int p1,int p2) { return p1>p2; } int dfs(int S,int cur,int maxn) { int i,j,flag,doc[80],len1; if(S==0) return flag=1; //printf("fuck!\n"); for(i=0,len1=0;i<n;i++) if(!vis[i]) { if(cur+num[i]<=maxn&&!noexit[cur+num[i]]) { vis[i]=1; flag=dfs(S-num[i],(cur+num[i])%maxn,maxn); if(flag)return flag; else{ noexit[cur+num[i]]=1; doc[len1++]=cur+num[i]; } vis[i]=0; if((cur+num[i])%maxn==0||cur==0){ for(j=0;j<len1;j++) noexit[doc[j]]=0; return 0; } } } for(j=0;j<len1;j++) noexit[doc[j]]=0; return 0; } int main() { int S,i,j,maxn; while(scanf("%d",&n),n) { memset(vis,0,sizeof(vis)); for(i=0,S=0,maxn=-10000;i<n;i++) { scanf("%d",&num[i]); S+=num[i]; if(num[i]>maxn)maxn=num[i]; } sort(num,num+n,cmp); for(j=maxn,flag=0;j<=S/2;j++) if(S%j==0) { memset(noexit,0,sizeof(noexit)); memset(vis,0,sizeof(vis)); flag=dfs(S,0,j); if(flag)break; } if(!flag)cout<<S<<endl; else cout<<j<<endl; } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator