【C++】回溯法解决装载问题

有 n 个集装箱要装上 2 艘载重分别为 c1 和 c2的轮船,其中集装箱 i 的重量为 w_i(1\le i \le n)wi(1≤ i ≤ n),且∑ 𝑤𝑖 ≤ 𝑐1 + 𝑐2 𝑛 𝑖=1 。

问是否有一个合理 的装载方案可以将这 n 个集装箱装上这 2 艘轮船?如果有,请给出装载方案。

实际上,只需要考虑第一个轮船,因为第一个装的最多的情况,就是第二个装得最少的情况

#include <iostream>
#include <vector>
using namespace std;

int current_weight = 0;     // 当前载荷
int max_weight = 0;         // 最大载荷
int c1=50;                  // 货轮1载荷
int c2=30;                  // 货轮2载荷
vector<int> goods = {10,20,30,10,10};   // 货物情况

/**
 * @param layer 指示目前处于二叉树的哪一层
 * */
void loading(int layer)
{
    if (layer >= goods.size()){  // 到达子节点,本程序'='是因为第一个货物编号为0
        if (current_weight > max_weight) max_weight = current_weight;
        return;
    }
    if (current_weight + goods[layer] < c1){    // 左子树:装上第i个货物的情况,只有满足条件的进行递归,不满足的剪枝
        current_weight += goods[layer];
        loading(layer+1);
        current_weight -= goods[layer];
    }
    // 右子树:不装第i个货物的情况,所有情况都可以进入
    loading(layer+1);
}

int main() {
    loading(1);
    int sum = 0;
    for (int good: goods){
        sum += good;
    }
    if (sum - max_weight <= c2) cout << "Can be loaded" << endl;
    else cout << "Can not be loaded" << endl;

    return 0;
}

需要注意的是,那个“二叉树”的结构是这样的:

这是一个涉及到4个货物的二叉树,其左子树代表装载当前货物,右子树则代表不装载 

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值