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 |
帮我看看怎么办吧!狂谢【附代码】,我知道哪里错了,不会改。9 15 3 2 11 4 1 8 8 8 比如就这个数据。答案是20 但是我的程序会把20否定掉。 因为按照降序排列,20的搜索会是15+4+1,这样的话剩下的数据就无法得出20的结论 本来应该是 15+3+2 8+8+4 11+8+1 关键点是不知道怎么改。。谢谢 #include <iostream> #define MAX 65 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:现在的长度;tn:现在已经搜索成功的棍子数目; //ni:搜索的坐标,既要搜索的棍子坐标; { int i; if(tn == num){yes = 1; return 1;} for(i=ni; i<n; i++) { if(!used[i]) nl+=stick[i]; if(nl>nLen) { nl-=stick[i]; continue; } else if(nl==nLen) { tn++; used[i]=1; if(dfs(0, 0, tn))return 1; used[i]=0;//?? } else if(nl<nLen) { used[i]=1; ni=i+1; if(dfs(nl, ni, tn))return 1; used[i]=0; break; } if(nl==0)break; } 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++) { 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