回溯法解最优装载问题

本文介绍了如何运用回溯法解决最优装载问题。在不超过轮船载重量的情况下,求解能装载最多集装箱的方案。解题步骤包括定义解空间、确定搜索结构和深度优先搜索,并通过减枝函数避免无效搜索。示例中详细展示了装载问题的解法,包括变量定义、初始化和回溯函数的实现。
摘要由CSDN通过智能技术生成
//再来学习一下回溯法
//一般解题步骤分为三步
//一:针对所给问题,定义问题的解空间
//二:确定易于搜索的解空间结构(一般为子集树或者排列树)
//三:以深度优先的方式搜索解空间,并且在搜索过程中用减枝函数避免无效搜索
//其中子集树就是选一部分,比如0-1背包问题,装载问题,
//而排列树就是选所有,只是顺序不一样,例如旅行商(邮递员)问题


//下面是装载问题的解法
//已知n个集装箱,轮船载重量为c,集装箱i的重量为Wi,要求是在不超重的情况下,
//装尽可能多数量的集装箱

#define NUM 100
int n;  //集装箱数量
int c;  //轮船载重量
int w[NUM]; //集装箱重量
int x[NUM]; //当前搜索的解向量
int r;  //剩余集装箱重量
int cw; //当前轮船载重量
int bestw;  //最优载重
int bestx[NUM]; //最优解向量

void init()
{
    bestw=0;
    for(int i=1;i<=n;i++)
    {
        cin>>w[i];
        r+=w[i];
    }
}

//形参代表搜索第t层节点,从1开始
void BackTrack(int t)
{
    //到达叶子节点
    if(t>n)
    {
        for(int i=1;i<=n;i++)
        {
            bestx[i]=x[i];
        }
        bestw=cw;
    }
    else
    {
        r-=w[t];    //更新剩余集装箱重量
        //判断是否可以向左
        //没有超出载重量
        if(cw+w[t]<=c) 
        {
            x[t]&#
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值