有 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;
}
需要注意的是,那个“二叉树”的结构是这样的:
这是一个涉及到4个货物的二叉树,其左子树代表装载当前货物,右子树则代表不装载