PKU 1011
2014-04-18 15:40
288 查看
#include <iostream> #include <algorithm> #include<fstream> #include<string.h > #define MAXN 64 using namespace std; int N, LEN, M; //LEN为原始棍子长度, M为原始棍子数量 int S[MAXN], MK[MAXN]; bool FLAG; int cmp(int a, int b) { return a > b; } void dfs(int k, int sum, int cnt) { if (cnt == M) //当前个数为棒子的个数 FLAG = true; else if (sum == LEN) dfs(0, 0, cnt+1); //有cnt个棒子的长度为len,即为所需要的长度 else for (int pre = -1, i = k; i < N; i++) if (!MK[i] && S[i]!=pre && S[i]+sum<=LEN) { pre = S[i]; MK[i] = true; //MK[]数组将已经遍历的棒子进行记录,下一次访问时,跳过这根棒子,对下一根棒子进行查找,搜索 dfs(i+1, sum+S[i], cnt); MK[i] = false; if (k == 0 || FLAG) return; } } int main() { int sum, i; freopen("data_sticks.txt","r",stdin); while (scanf("%d", &N) != EOF && N) { FLAG = false; sum = 0; for (i = 0; i < N; i++) { scanf("%d", &S[i]); sum += S[i]; } sort(S, S+N, cmp); //将S[]数组从大到小排序,以此得到在得到长度的最小值之后跳出循环 cout<<S[0]<<endl; for (LEN = S[0]; LEN < sum; LEN++) if (sum % LEN == 0) { M = sum / LEN; //棒子的长度都相等,在这里求出棒子的个数 memset(MK, 0, sizeof(MK)); dfs(0, 0, 0); if (FLAG) //在得到最小值后直接跳出循环 break; } printf("%d\n", FLAG? LEN : sum); } return 0; }
相关文章推荐
- pku1011
- pku 1011(dfs)
- PKU-1011 Sticks (DFS + 剪枝)
- pku1011 深搜+强剪枝
- PKU1011 Sticks
- PKU 1011
- pku 1011 解题报告
- pku 1011 sticks
- PKU 1011 Sticks
- PKU 1011 Sticks
- ACM PKU 1011 Sticks 深度优先搜索
- PKU 1011 Sticks
- 北大PKU在线测试1011
- pku 1011
- 搜索剪枝回溯经典题目 pku 1011 sticks
- PKU1011 Sticks 经典DFS(TLE了。。没办法)
- pku1011
- PKU 1011
- pku 1011 sticks
- pku 1011 sticks 经典DFS+剪枝