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

C++ 递归回溯,显示最佳解决方案,c++,recursion,recursive-backtracking,C++,Recursion,Recursive Backtracking,在学校,我应该使用递归回溯来解决一个船型难题。用户输入船的最大重量、项目类型的数量以及每个项目类型的重量和值。每种类型的物品都可以放置在船上 我们的任务规定“该计划应找到一种解决方案,用选定的有价值的物品填充船,使船上物品的总价值最大化,同时物品的总重量保持在船的重量能力范围内。” 它还为递归回溯算法提供了非常具体的模板 目前,我正在使用连续的项目列表来存储可能的项目和船上的项目。item结构包括用于权重、值、计数(使用次数)的int成员,以及用于打印的唯一代码。然后我有一个Boat类,它包含数

在学校,我应该使用递归回溯来解决一个船型难题。用户输入船的最大重量、项目类型的数量以及每个项目类型的重量和值。每种类型的物品都可以放置在船上

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

它还为递归回溯算法提供了非常具体的模板

目前,我正在使用连续的项目列表来存储可能的项目和船上的项目。item结构包括用于权重、值、计数(使用次数)的int成员,以及用于打印的唯一代码。然后我有一个Boat类,它包含数据成员max\u-weight、current\u-weight、value\u-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;
    }
}
bool求解(船和船){
如果(船没有更多(){
boat.print();
返回true;
}
否则{
int pos;
对于(int i=0;i
所有函数几乎完全按照其名称执行。如果船上没有任何可能的项目,则不再返回true。大小返回可能项目列表的大小。添加和删除项目会相应地更改项目计数数据以及船的当前重量和值总和成员。另外,add_item、remove_item和can_place参数是正在使用的可能项目的索引。为了确保找到最大化的值,可能项目的列表按船的构造函数中的值降序排序,该构造函数将可能项目的列表作为参数

这里还有一个输入和输出的示例:


非常感谢您的任何见解

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


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

这就是最常见的“背包问题”——这可能是一个有用的起点。