UVA307
来源:互联网 发布:阿里旺旺网络连接失败 编辑:程序博客网 时间:2024/05/10 04:51
题目意思就是给定这么多木棒,要几个几个组合成等长的几段,问组和成的长度最短是多少。
先是要剪枝;
1.首先,组合成的长度,最少是这些木棍中最长的那一条,最长是木棍长的和。
2 .然后如果长度不能被总长整除就不行。
3. 每次都要选;
4。然后如果已经有一个已经组成了这个长度,而剩下的不能组成,说明也不行
AC 代码:
#include<iostream>#include<algorithm>using namespace std;const int N = 100;int stick[N];int num;int sum;int mlong;int vis[N];void init() {for (int i = 0 ; i < N ; i++) {vis[i] = 0;}}int cmp (int a, int b) {return a > b;}bool dfs (int cur , int aim ,int left ,int k) {if (cur == aim)return true;for (int i = k; i < num ; i++) {if (!vis[i] && stick[i] < left) {vis[i] = 1;if (dfs(cur , aim , left - stick[i] , i + 1))return true;vis[i] = 0;if (left == sum / (aim + 1)) // 第三个剪枝return false;} if (!vis[i] && stick[i] == left ) {vis[i] = 1;if (dfs(cur + 1 ,aim , sum / (aim + 1) , 0))return true;vis[i] = 0;return false; // 第四个剪枝 }}return false;}int main () {while (cin >> num && num) {sum = 0;init();for (int i = 0 ; i < num ; i++) {cin >> stick[i];sum += stick[i];}sort(stick , stick + num ,cmp);mlong = stick[0];for (int i = mlong ; i <= sum ;i++) { //第一个剪枝if (sum % i != 0) //第二个剪枝continue;if (dfs(0 , sum / i - 1 , i , 0)) {cout << i <<endl; break;}}}}
1 0
- UVA307
- uva307 dfs
- [回溯&&剪枝]Sticks UVA307
- UVa307 - Sticks(DFS+剪枝)
- poj1011 && uva307 DFS + 剪枝
- 习题7-14 小木棍 UVa307
- Uva307 Sticks 【dfs+剪枝】【习题7-14】
- UVA307把n个剪断的木棍还原,暴搜
- 给定一整型数组,若数组中某个下标值大的元素值小于某个下标值比它小的元素值,称这是一个反序
- LeetCode 1 Reverse Words in a String
- 2大类型的设备驱动程序(2 main types of device driver)
- POJ-1400(删除冗余括号)
- 迷茫
- UVA307
- 实现算法2.4的程序
- Airport(凸包加点与直线的距离)
- 在VS2010下建立cocos2dx项目
- Leetcode--Reorder List
- 二分图 zoj 1137 poj 1325 poj1422 hdu2063 hdu1498
- 工作流任务的超时计算
- android学习前传
- 一步步带你深入理解数据结构系列--散列表