Sticks UVA

来源:互联网 发布:javascript .tagname 编辑:程序博客网 时间:2024/06/05 23:42

首先计算出所有的木棍的总长度,然后对能够合成的木棍的数量进行枚举,可以肯定的一点是能够分成的木棍的数量是一定能够被总长度进行整除的。然后将计算得到的部分的木棍的长度进行dfs搜索,每次配对的时候都首先选择当前未用的最长的木棍,然后判断目前配对的木棍的长度是否满足要求,如果已经满足要求,那么就继续开始下一个的配对,如果配对还是不到满足要求的长度,那么继续下一轮的递归。同时在递归的时候要统计已经使用的木棍的个数,如果已经使用结束了,那么就返回true,否则继续后续的判断。具体实现见如下代码:

#include<iostream>#include<vector>#include<string>#include<set>#include<stack>#include<queue>#include<map>#include<algorithm>#include<cmath>#include<iomanip>#include<cstring>#include<sstream>#include<cstdio>#include<deque>#include<functional>using namespace std;int n;vector<int> sticks;bool visit[105];bool dfs(int cur_l,int aim_l,int ind,int amount){if (amount == n){return true;}for (int i = ind; i>=0; i--){if (visit[i]) continue;if (cur_l + sticks[i] < aim_l){visit[i] = true;if (dfs(cur_l + sticks[i], aim_l, i - 1,amount+1)) return true;visit[i] = false;while (i - 1 >= 0 && sticks[i - 1] == sticks[i]) i--;}else if (cur_l + sticks[i] == aim_l){visit[i] = true;if (dfs(0, aim_l, n-1,amount+1)) return true;visit[i] = false;return false;}if (cur_l == 0) return false;}return false;}int main(){while (cin >> n){if (n == 0) break;int total = 0;sticks.clear();int sum = 0;for (int i = 0; i < n; i++){int t;cin >> t;sum += t;sticks.push_back(t);}sort(sticks.begin(),sticks.end());int i;for (i = n; i > 0; i--){memset(visit,0,sizeof(visit));if ((sum%i == 0)&&(sticks[n-1]<=(sum/i)) && dfs(0,sum/i,n-1,0)){break;}}cout << sum/i << endl;}return 0;}

原创粉丝点击