UVa307 - Sticks(DFS+剪枝)
来源:互联网 发布:linux 线程挂起 编辑:程序博客网 时间:2024/05/10 11:00
题意:给出若干个一样长的sticks,剪断后有n个部分,问原来sticks的最小长度。
思路:首先要确定sticks的长度范围,范围应该在[max(n1,n2..., n), sum(n1,n2...,n)}之间。然后用深度优先算法,在深搜时注意剪枝
(1)如果当前木棒搜索没有成功,那么后面的木棒长度与当前木棒长度一样,就应该跳过。
(2)如果当前木棒是第一个是没有成功,后面的也不会成功
#include <cstdio>#include <algorithm>#include <limits>#include <cstring>#include <functional>using namespace std;const int N = 100;bool vis[N];int a[N];int n;int sum, Max;int len;bool input(){scanf("%d", &n);if (n == 0) return false;Max = 0;sum = 0;for (int i = 0; i < n; i++) {scanf("%d", &a[i]);Max = max(Max, a[i]);sum += a[i];}return true;}bool dfs(int complete, int pos, int length){if (complete == n) return true;for (int i = pos; i < n; i++) {if (vis[i]) continue;if (a[i] + length < len) {vis[i] = true;if (dfs(complete + 1, i + 1, a[i] + length)) return true;vis[i] = false;while (a[i] == a[i + 1] && i + 1 < n) i++;if (length == 0) return false;} else if (a[i] + length == len) {vis[i] = true;if (dfs(complete + 1, 0, 0)) return true;vis[i] = false;return false;}}return false;}void solve(){sort(a, a + n, greater<int>());for (len = Max; len <= sum / 2; len++) {if (sum % len == 0) {memset(vis, false, sizeof(vis));if (dfs(0, 0, 0)) {printf("%d\n", len);break;}}}if (len > sum / 2) printf("%d\n", sum);}int main(){#ifndef ONLINE_JUDGEfreopen("d:\\OJ\\uva_in.txt", "r", stdin);#endifwhile (input()) {solve();}return 0;}
0 0
- UVa307 - Sticks(DFS+剪枝)
- Uva307 Sticks 【dfs+剪枝】【习题7-14】
- [回溯&&剪枝]Sticks UVA307
- poj1011 && uva307 DFS + 剪枝
- POJ1011-Sticks DFS+剪枝
- poj1011 Sticks(dfs+剪枝)
- POJ1011 Sticks DFS+剪枝
- POJ1011 Sticks【DFS+剪枝】
- HDU1455 Sticks(DFS+剪枝)
- Sticks --dfs 剪枝
- poj1011 -- Sticks (DFS+剪枝)
- uva307 dfs
- poj 1011Sticks(DFS +剪枝)
- POJ 1011 Sticks dfs + 剪枝
- PKU-1011 Sticks (DFS + 剪枝)
- HDU 1455 Sticks(DFS+剪枝)
- POJ 1011 Sticks DFS+剪枝
- poj 1011 Sticks -----dfs+剪枝
- 互联网黑市分析:社工库的传说
- xorg初始化过程分析,总结
- unity2d游戏开发大坑之图集打包
- 数据仓库应用(一):数据仓库模型设计
- HDU 5175 Misaki's Kiss again (异或运算,公式变形)
- UVa307 - Sticks(DFS+剪枝)
- ASCII码(包含二进制,八进制,十进制,十六进制,ascii码的对照表)
- C++算法:广度优先搜索大数
- PieTTY 连接Linux
- Integer.valueOf(String)方法字符串转整型- 你肯定不知道的疑惑!
- T(n) = T(n/2) + O(n)
- (API GUIDE 1)Introduction to Android 介绍安卓
- bzoj1500: [NOI2005]维修数列
- java_基础_类入门