POJ1011
来源:互联网 发布:js attr style 编辑:程序博客网 时间:2024/06/05 15:34
//小木棒问题经典搜索(剪枝)//将木棒按照降序排序//从最大的单根木棒长度开始搜索,一直搜索到所有木棒长度的总和,判断这种长度能否实现#include <stdio.h>#include <iostream>#include <string.h>#include <algorithm>using namespace std;int stick[70];int sum , len , num , many;bool visit[70] ;//记录当前木棒是否被使用bool comp(int a , int b){ return a > b ;}bool DFS(int n , int l , int p)//n是当前拼好了几根木棒;l代表当前在拼的这根木棒长;p为在木棒数组里搜索到的当前下标{ if(n == many) return true ; for(int i = p + 1 ;i < num ; i ++) { if(visit[i]) continue ; if(l + stick[i] == len) { visit[i] = true ; if(DFS(n + 1 , 0 , -1)) return true ; visit[i] = false ; return false ; } else if(l + stick[i] < len) { visit[i] = true ; if(DFS(n , l + stick[i] , i)) return true ; visit[i] = false ; if(l == 0) return false ; while(stick[i] == stick[i+1]) i++;//如果当前的长度搜索失败, 那么和该长度相等的长度也会搜索失败 } } return false ;}int main(){ while(scanf("%d",&num)!=EOF,num) { sum = 0 ; for(int i = 0 ; i < num ; i ++) { scanf("%d",&stick[i]) ; sum += stick[i] ; } sort(stick , stick + num , comp) ; for(len = stick[0] ; len <= sum ; len ++) { if(sum % len == 0) { many = sum / len ; memset(visit , false , sizeof(visit)) ; if(DFS(1,0,-1)) { printf("%d\n",len); break ; } } } } return 0 ;}
0 0
- POJ1011
- POJ1011
- poj1011
- poj1011
- POJ1011
- POJ1011
- poj1011
- poj1011
- poj1011
- POJ1011
- poj1011
- poj1011
- poj1011
- poj1011
- poj1011
- poj1011
- poj1011
- POJ1011
- Linux内核---45.关于initcall
- 各种排序算法的场景以及c++实现(插入排序,希尔排序,冒泡排序,快速排序,选择排序,归并排序)
- YUYV码流中提取单帧并转为RGB图片
- echarts3各种配置项
- setbuf()
- POJ1011
- Linux内核---46.关于mem_map
- poj滑雪(记忆化搜索)
- C 语言的程序的编辑,编译和运行
- Linux内核---47.关于clk_get与clk_enable
- 降采样和上采样(图像)
- setbuf函数使用注意事项
- 手势识别与事件库 Touch.js若干问题及解决方法
- 【打CF,学算法——三星级】CodeForces 567D One-Dimensional Battle Ships (二分)