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 |
Re:改了一遍。现在是TLE。。。。我崩溃了。。。。In Reply To:回溯过程中nl,tn,ni的值都是要恢复的。 Posted by:love8909 at 2009-01-25 11:57:21 #include <iostream> #define MAX 100 using namespace std; int stick[MAX]; int used[MAX]; int n, nLen; int sumL, num; int yes; int cmp(const void *r1, const void *r2) { return *(int *)r2 - *(int *)r1; } int dfs(int nl, int ni, int tn)//nl:now len;tn:now num;ni:search tx; { int i; if(yes)return 1; if(tn == num){yes = 1; return 1;} for(i=ni; i<n; i++) { if(!used[i]) { if(nl+stick[i]<nLen) { now=stick[i]; used[i]=1; if(dfs(nl+stick[i], i+1, tn))return 1; if(tn == num){yes = 1; return 1;} if(yes)return 1; used[i]=0;//?? break; } else if(nl+stick[i]==nLen) { used[i]=1; if(dfs(0, 0, tn+1))return 1; if(tn == num){yes = 1; return 1;} if(yes)return 1; used[i]=0; } } } return 0; } int main() { int i; while(scanf("%d", &n) && n) { sumL = 0; memset(stick, 0, sizeof(stick)); //Input for(i=0; i<n; i++) { scanf("%d", &stick[i]); sumL += stick[i]; } //Sort from big to small qsort(stick, n, sizeof(int), cmp); for(i=stick[0]; i<sumL; i++) { yes = 0; if(sumL%i == 0) { memset(used, 0, sizeof(used)); num = sumL/i; nLen = i; dfs(0, 0, 0); if(yes == 1)break; } } printf("%d\n", nLen); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator