A5剪枝算法

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if(a[x]==a[fail]) continue;//从4开始考虑 if(rest>a[x]) {
vis[x]=1; bool w=run(i,rest-a[x],x); vis[x]=0; if(!w) fail=x; if(w) return 1; }
else if(rest==a[x]) { vis[x]=1; bool w=run(i+1,len,0); vis[x]=0; return w; } if(p==0) return 0;
以小木棒问为例 的回溯剪枝算法
A5组 王奇 申家钰 徐会寒.
问题描述
乔治拿来一组等长的木棒,将它们随机地裁断,使得
每一节木棍的长度都不超过50个长度单位。然后他又想把这
些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒
以及木棒的初始长度。
ADD YOUR TITLE
ADD YOUR TITLE
ADD YOUR TITLE
ADD YOUR TITLE
请你设计一个程序,帮助乔治计算木棒的可能最小长度。 Nothing we can do will change it.
Nothing we can do will change it.
Nothing we can do will change it.
将小木棍从大到小排序:我们发现如果小段的木棍先进“队”的话回溯的 层次将会比大段的木棍先进多得多。(大段的木棍约束性会更强些)。 如果每堆的第一根木棍判断出无解则返回false:因为木棍在不同的堆中都可以作 为第一根,所以如果木棍在这一堆中不满足,则到其他堆去同样不满足。
如果放入某堆中的最后一根木棍刚好rest==0(也就是将此堆放满)但后续不满足 则返回false,原因同上。
scanf("%d",&a[i]); maxv=max(maxv,a[i]); tot+=a[i]; } sort(a+1,a+1+n,cmp); for(len=maxv;len<=tot;len++)//15除以5能除尽,长度必须大于5. if(tot%len==0) { k=tot/len; if(run(1,len,0)) {
之后选择的元素=之前选择的元素:选后效果将会是一样的,返回false还会是返回 false。实现时需注意可能当前的元素可能会因为和上一个vis=1(用过)的数相等而 被continue,所以这里用一个失败参数记录上一次失败用的元素。
02 程序设计
int main() {
scanf("%d",&n);//1,2,3,4,5为例 for(int i=1;i<=n;i++) {
Everything we do will affect it.
Everything we do will affect it.
The future is before us and dynamic. Everything we do will affect it.
01 剪枝思路
有以下四种剪枝思路:
Nothing we can do will change it.
The future is before us and dynamic.
The future is before us and dynamic.
The future is before us and dynamic.
每一节木棍的长度都用大于零的整数表示。 Everything we do will affect it.
printf("%d",len); break; } } return 0; }
02 程序设计
bool run(int i,int rest,int p)//第i堆还差rest的长度到len,第i堆 中刚才选了第p根 //i=1,rest=5,p=0 {
if(i>k)//共k堆 {
return 1; } int fail=0; for(int x=p+1;x<=n;x++)//从第p+1根开始选, if(!vis[x]) {
} return 0; }
03 实验结果
THANK YOU FOR WATCHING
相关文档
最新文档