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:参考了网上的思路,总算A了,此题真是回溯的神题啊!In Reply To:参考了网上的思路,总算A了,此题真是回溯的神题啊! Posted by:zoujing1978 at 2017-04-08 10:59:31 > #include <iostream> > #include <algorithm> > 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: > Sticks(int n); > ~Sticks(); > void ReadData(); > int DFS(); > }; > > Sticks::Sticks(int n) > { > this->n = n; > a = new int[n]; > used = new bool[n]; > } > > Sticks::~Sticks() > { > delete[] a; > delete[] used; > } > > void Sticks::ReadData() > { > sum = 0; > for (int i = 0; i < n; i++) > { > cin >> a[i]; > sum += a[i]; > } > } > // stickCount:下标index(含)前已经搜索过的组合成完整的长度为aim的长棍子的数量 > // len:本次搜索已经构成的长度 > // index:要搜索下标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); > reverse(a, a + n); > for (int aim = a[0]; aim <= sum; aim++) > { > if (sum % aim == 0) > { > memset(used, false, sizeof(bool) * n); > if (DFS(0, 0, -1, aim)) > { > return aim; > } > } > } > return 0; > } > > int main() > { > int n = 0; > cin >> n; > while (n > 0) > { > Sticks obj(n); > obj.ReadData(); > cout << obj.DFS() << "\n"; > cin >> n; > } > return 0; > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator