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 |
来一个AC的代码#include <iostream> #include <algorithm> #include <cstring> #include <functional> using namespace std; class Sticks { protected: int* a; int n; int sum; bool* used; bool DFS(int stickCount, int len, int index, int aim); public: void Solve(); int DFS(); }; void Sticks::Solve() { cin >> n; while (n > 0) { a = new int[n]; used = new bool[n]; sum = 0; for (int i = 0; i < n; i++) { cin >> a[i]; sum += a[i]; } cout << DFS() << "\n"; delete[] used; delete[] a; cin >> n; } } // stickCount:下标index(含)前已经搜索过的组合成完整的长度为aim的长棍子的数量 // len:本次搜索已经构成的长度 // index:前一次搜索的时候,搜索到的木棍的最大下标 // aim:目标长度 bool Sticks::DFS(int stickCount, int len, int index, int aim) { if (stickCount == sum / aim) { return true; } for (int i = index + 1; i < n; i++) { if (used[i]) { continue; } if (len + a[i] == aim) { used[i] = true; if (DFS(stickCount + 1, 0, -1, aim)) { return true; //这里的程序结构很巧妙 } used[i] = false; return false; } else if (len + a[i] < aim) { used[i] = true; if (DFS(stickCount, len + a[i], i, aim)) { return true; } used[i] = false; if (len == 0) { return false; } while (a[i] == a[i + 1]) // 剪枝技巧之一 { i++; } } } return false; } int Sticks::DFS() { sort(a, a + n, greater<int>()); for (int aim = a[0]; aim <= sum; aim++) { if (sum % aim == 0) { fill(used, used + n, false); if (DFS(0, 0, -1, aim)) { return aim; } } } return 0; } int main() { Sticks obj; obj.Solve(); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator