我在这个网站上搜索并阅读了许多背包问题,但不幸的是它们与我的不同,所以我在这里问我的问题。
我有一个权重列表(按降序排列)和所需的容量。例如,分别为(11,8,7,6,5,3,2,1)和20。我需要找到并显示达到所需容量的每个组合(20)。
我需要使用递归来做这个,所以我想要做的方法就是简单地调用函数两次:一次添加到下一个项目,一次没有。但是,我无法让它发挥作用,现在感觉好像我偏离轨道。
经过一些修补,我现在差不多完成了任务。它将于今天晚上11点到期,所以我非常感谢我的代码第二双眼睛。
我的变量有以下输入:capacity = 20,称为权重的数组有值(20 11 8 7 6 5 3 2 1)。
我希望的输出是:(20,11 8 1,11 7 2,11 6 3,11 6 2 1,15 5 3 1,8 7 5,8 6 5 1,8 6 3 2 1,7 6 5 2)。
输出时,每个逗号代表一个新行。当我的代码贯穿其中时,它产生了所有上述解决方案,除了11 6 2 1.我尝试过添加print语句等等,但似乎无法找到任何理由为什么错过了这一条路径。我在下面附上了我的新方法。唯一缺少的部分是main(它只是生成数组和容量并相应地设置它们的值并在第一次调用函数)并且总和和显示在代码下面详细说明。
public static boolean knapSackProblem(int capacity, int counter, int []knapSack, int[] weights)
{
boolean solution = false;
if(counter >= weights.length) // makes sure you don't go out of bounds
{
solution = false;
return solution; // no more items to check
}
if((weights[counter] == capacity) && (counter < weights.length))
{
System.out.print(weights[counter] + "\n"); // print the weight that equals the capacity
counter++; //increase counter to prevent from just displaying the first number
}
if(sum(knapSack) > capacity)
{
System.out.print(" sum too large reached\n"); // test statement
solution = false; // number is too big exit
return solution; // don't call function again
}
if(capacity == (sum(knapSack) + weights[counter]))
{
knapSack[counter] = weights[counter]; //add the value into the knapSack array
display(knapSack);
knapSack[counter] = 0; // removes winning value so it can continue
//System.out.print("Valid answer displayed\n");
}
if(capacity > (sum(knapSack) + weights[counter]))
{
knapSack[counter] = weights[counter];//add it in call again
solution = knapSackProblem(capacity, counter + 1, knapSack, weights);
if(!solution)
{
knapSack[counter] = 0;
knapSackProblem(capacity, counter + 1, knapSack, weights);
}
}
else if(capacity < (sum(knapSack) + weights[counter]))
{
knapSackProblem(capacity, counter +1 , knapSack, weights);
}
return solution;
}
缺少的两个功能是:
sum
:它只是一个for循环,并在返回值之前添加knapSack数组中的所有值。display
:通过并显示数组中不为0的所有数字(因为永远不会提供0)非常感谢你的帮助。
注意:我知道我目前的解决方案并不是最优雅的,当前版本肯定会让我获得A,但我真的很想学习改进此代码的方法,所以我们非常感谢任何提示或解决方案!