回溯法解决合理用料问题

本文介绍了如何运用回溯法解决一个实际问题:如何在若干规格的轴中选择,使得用同一种圆钢制作时,下料方案既能满足需求,又使余料最少。算法设计包括定义轴的规格、圆钢长度,以及通过递归回溯法搜索最佳解决方案。在搜索过程中,不断更新最优总长度和装载方案,最终在主函数中调用Backtrack实现完整搜索,得出最大总长度和最优装载方案。
摘要由CSDN通过智能技术生成

一、项目描述
某汽车需要用若干规格的轴各一根,这些轴的规格分别是a1米,a2米,…,an米(1.5米、1米、0.7米),这些轴需要用同一种圆钢来做,圆钢长度为SL米(如4米),有多少种下料方案,这些方案中余料最少的方案是哪种。(每种下料方案中可以包括规格中的一部分或全部)提示:用动态规划或回溯法(按0-1背包)解决。

二、算法设计
a. 轴的规格分别是a1米,a2米,…,an米,圆钢长度为SL米,用n表示车轴规格个数,SL表示圆钢起始长度,L表示去掉最可能情况后最大长度 ,bestl表示车轴当前最大长度 ,l[i]表示车轴规格长度,x[i]暂存某规格车轴的选中情况,len当前所选车轴总长度
b. 用递归函数Backtrack(int i,int len)来实现回溯法搜索子集树(形式参数i表示递归深度,n用来控制递归深度,形式参数i和len表示当前总价值和总重量,bestp表示当前最优总价值):
① 若i >n,则算法搜索到一个叶结点,判断当前长度是否最优:
1> 若len>bestl&&len<L,更新当前最优总长度为bestl=len;,更新装载方案(即bestx[i]=xi);
2> 若总长度不大于圆钢长度(即len+x[i]*l[i]<=L),则更新当前总长度(即len+=l[i]*x[i]; ), 对物品i+1调用递归函数Backtrack(int i,int len)继续进行装载;
3> 函数Backtrack(int i,int len)调用结束后则返回当前总长度(即 len+=l[i]*x[i];);
4> 当j>1时,for循环结束;
③ 当i=1时,若已测试完所有装载方案,外层调用就全部结束;
c. 主函数调用一次Backtrack(1,0)即可完成整个回溯搜索过程,最终得到的bestl和bestx[i]即为所求最大总长度和最优装载方案。

三、程序

#include<stdio.h>
int n,SL,L,bestl;	//车轴规格个数,圆钢长度,最大长度 
int l[10000],x[10000],bestx[10000];	   //车轴规格长度,x[i]暂存某规格车轴的选中情况

void Backtrack(int i,int len)	/
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值