在Java中使用递归的背包变体

时间:2014-10-10 00:28:46

标签: java arrays recursion

我在这个网站上搜索并阅读了许多背包问题,但不幸的是它们与我的不同,所以我在这里问我的问题。

我有一个权重列表(按降序排列)和所需的容量。例如,分别为(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,但我真的很想学习改进此代码的方法,所以我们非常感谢任何提示或解决方案!

0 个答案:

没有答案