博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj1011 Sticks (dfs剪枝)
阅读量:5221 次
发布时间:2019-06-14

本文共 1516 字,大约阅读时间需要 5 分钟。

【题目描述】

George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to return sticks to the original state, but he forgot how many sticks he had originally and how long they were originally. Please help him and design a program which computes the smallest possible original length of those sticks. All lengths expressed in units are integers greater than zero.

【题目链接】

【算法】

枚举答案对每一种情况构造+判定。剪枝技巧:

1. 优化搜索顺序 2. 排除等效冗余     (1)构造选取的棍子递减的取     (2)初始为0的棍子若无法构造出答案,则该分支减去     (3)构造选取的棍子不重复选择同样长度的已经失败过的棍子。

【代码】

#include 
#include
#include
using namespace std;int n,all,lim;int a[100],v[100];bool dfs(int cur,int len,int last) { if(cur>all) return 1; if(len==lim) return dfs(cur+1,0,1); int fail=0; for(int i=last;i<=n;i++) { if(!v[i]&&len+a[i]<=lim&&a[i]!=fail) { v[i]=1; if(dfs(cur,len+a[i],i+1)) return 1; fail=a[i]; v[i]=0; if(len==0) return 0; } } return 0;}int main() { while(~scanf("%d",&n)&&n) { int sum=0,val=0; for(int i=1;i<=n;i++) scanf("%d",&a[i]),sum+=a[i],val=max(a[i],val); sort(a+1,a+n+1); reverse(a+1,a+n+1); for(lim=val;lim<=sum;lim++) { if(sum%lim==0) { all=sum/lim; memset(v,0,sizeof(v)); if(dfs(1,0,1)) break; } } printf("%d\n",lim); } return 0;}

转载于:https://www.cnblogs.com/Willendless/p/9522744.html

你可能感兴趣的文章
图像处理中双线性插值
查看>>
RobHess的SIFT代码解析之RANSAC
查看>>
03 线程池
查看>>
201771010125王瑜《面向对象程序设计(Java)》第十三周学习总结
查看>>
手机验证码执行流程
查看>>
python 基础 ----- 变量
查看>>
设计模式课程 设计模式精讲 2-2 UML类图讲解
查看>>
Silverlight 的菜单控件。(不是 Toolkit的)
查看>>
:hover 鼠标同时触发两个元素变化
查看>>
go语言学习十三 - 相等性
查看>>
Idea 提交代码到码云(提交到github也大同小异)
查看>>
c#连接excel2007未安装ISAM解决
查看>>
Mono 异步加载数据更新主线程
查看>>
初识lua
查看>>
我是插件狂人,jDuang,jValidator,jModal,jGallery
查看>>
张季跃 201771010139《面向对象程序设计(java)》第四周学习总结
查看>>
如何解除循环引用
查看>>
android中fragment的使用及与activity之间的通信
查看>>
字典【Tire 模板】
查看>>
jquery的contains方法
查看>>