对于学校,我应该使用递归回溯来解决船难题。用户输入船的最大重量、物品类型的数量以及每种物品类型的重量和价值。每种物品类型中都可以放置一个以上的物品。
我们的任务是“程序应该找到一个解决方案,用选定的有价值的物品装满船,使船上物品的总价值最大化,而物品的总重量保持在船的承重范围内。”
它还具有用于递归回溯算法的非常具体的模板。
目前我正在使用连续的项目列表来存储可能的项目和船上的项目。item 结构包括重量、值、计数(使用次数)的 int 成员和用于打印目的的唯一代码。然后我有一个 Boat 类,其中包含数据成员 max_weight、current_weight、value_sum 和每个连续列表的成员,然后是解决难题所需的成员函数。我的所有类函数似乎都运行良好,并且在给定示例输入的情况下,我的递归确实显示了正确的答案。
我想不通的是额外得分的条件,即“修改你的程序,使其显示总权重最低的最佳解决方案。如果有两个总权重相同的解决方案,打破通过选择其中项目最少的解决方案来打成平手。” 我已经看了一段时间,但我只是不确定如何更改它以确保重量最小化同时也最大化价值。这是我的解决方案的代码:
bool solve(Boat &boat) {
if (boat.no_more()) {
boat.print();
return true;
}
else {
int pos;
for (int i = 0; i < boat.size(); i++){
if (boat.can_place(i)) {
pos = boat.add_item(i);
bool solved = solve(boat);
boat.remove_item(pos);
if (solved) return true;
}
}
return false;
}
}
所有函数的功能几乎完全符合其名称。如果船上没有任何可能的物品,则不再返回 true。Size 返回可能项目列表的大小。添加和删除项目会相应地更改项目计数数据以及 Boat current_weight 和 value_sum 成员。此外,add_item、remove_item 和 can_place 参数是正在使用的可能项目的索引。为了确保找到最大值,可能项目的列表在 Boat 的构造函数中按值降序排序,该构造函数将可能项目列表作为参数。
这里还有一个输入和输出的例子:
非常感谢任何见解!