递归回溯,显示最佳解决方案

时间:2014-06-17 20:47:35

标签: c++ recursion recursive-backtracking

对于学校我应该使用递归回溯来解决船难题。用户输入船的最大重量,物品类型的数量,以及每种物品类型的重量和值。每种物品类型中不止一种可以放在船上。

我们的任务规定:“该计划应该找到一种解决方案,用一些选定的贵重物品填充船只,使船上物品的总价值最大化,同时物品的总重量保持在船的重量范围内。 “

它还具有非常具体的递归回溯算法模板。

目前,我正在使用连续的物品清单来存储船上可能的物品和物品。 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;
    }
}

所有功能都与他们的名字完全相同。如果船上没有任何可能的物品,则不会再返回。 Size返回可能项目列表的大小。添加和删​​除项目会相应地更改项目计数数据以及Boat current_weight和value_sum成员。 add_item,remove_item和can_place参数也是正在使用的可能项的索引。为了确保找到最大化的值,可能的项列表按照Boat的构造函数中的值按降序排序,它将可能的项列表作为参数。

这里还有一个输入和输出的示例: input and output example

非常感谢任何见解!

1 个答案:

答案 0 :(得分:1)

原来,上述解决方案是正确的。我得到错误答案的唯一原因是因为我实现了nomore()函数。在函数中,我检查可能的项目列表中的任何项目是否小于船上剩余的重量。我应该一直在检查它们是否小于或等于船上的重量。一个简单的错误。

维基百科条目确实有用,我很喜欢这部漫画:)

相关问题