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

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

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

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

#include 
#include 
using namespace std;

int current_weight = 0;     // 当前载荷
int max_weight = 0;         // 最大载荷
int c1=50;                  // 货轮1载荷
int c2=30;                  // 货轮2载荷
vector 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;
}

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

【C++】回溯法解决装载问题_第1张图片

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

你可能感兴趣的:(算法设计与分析,c++,算法,数据结构)