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 |
记得按LRJ黑书上的说法,如果搜索顺序和剪枝OK的话,满足题意的任何数据运算都不会超过100msIn Reply To:谁发些bt的数据来测一下,看看可以把这段代码给TLE不。有兴趣的可以研究一下代码 Posted by:piratelzs at 2006-12-11 21:04:51 > #include <iostream> > #include <fstream> > > using namespace std; > #define MAX 64 > #define VERYLARGE 1000000 > > int stick[MAX]; > int diff[MAX]; // 在第几中被占用了 > int mark[MAX]; // 在第几中被占用了 > int nCount, nSum, nResult = 0; > > int IsFinished(int nMark) > { > for (int i = 0; i < nCount; i ++) > { > if (mark[i] > nMark) return 0; > } > return 1; > } > > void dfs(int nGoal, int nTemp, int nBegin, int nMark) // 计算函数 > { // 从stick中由nBegin开始找出小于 nGoal - nTemp的数 > // 现在已经的和为nTemp,nMark该组起始数的索引为(用以区分) > // 全搜索、遍历所有可能 > int i; > for (i = nBegin; i < nCount; i ++) > { > if (!(mark[i] > nMark && !nResult && nTemp + stick[i] <= nGoal)) > continue; > mark[i] = nMark; > if (stick[i] + nTemp == nGoal) // 如果相等 > { > if (IsFinished(nMark)) > { > nResult = nGoal; return; > }// > dfs(nGoal, 0, nMark + 1, nMark + 1); > } > else > { > dfs(nGoal, nTemp + stick[i], i + 1, nMark); > } > if (!nResult) > mark[i] = VERYLARGE; > while (!nResult && i < nCount && stick[i] == stick[i + 1]) i ++; // 剪枝 > } // for > } > > int calculate() > { > int i; > for (i = stick[0]; i < nSum; i ++) > { > if (nResult) break; > if (!(nSum % i)) dfs(i, 0, 0, 0); > } > if (!nResult) > nResult = nSum; > return nResult; > } > > int compare(const void* a,const void* b) > { > return *(int*)b - *(int*)a ; > } > > int main() > { > cin >> nCount; > while (nCount) > { > if (nCount < 0 || nCount > 64) > continue; > memset((void*)stick, 0, sizeof(int) * MAX); //清零 > int i; > nSum = 0; > for (i = 0; i < nCount; i ++) > { > cin >> stick[i]; > if(stick[i] > 50 || stick[i] <= 0) > stick[i] = 0; > mark[i] = VERYLARGE; > nSum += stick[i]; > } // for > > nResult = 0; > // 开始计算 > qsort(stick, nCount, sizeof(int), compare); > int j = 0; > for (i = 0; i < nCount - 1; i ++) > { > diff[i] = 0; > if (stick[i] != stick[i + 1]) > diff[i] = i + 1; > } > > calculate(); > cout << nResult << endl; > cin >> nCount; > }; // while > > return 0; > } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator