【问题标题】:Knapsack Solution using Recursion and Array使用递归和数组的背包解决方案
【发布时间】:2017-02-23 22:24:33
【问题描述】:

我想知道修改此代码的最佳方法。我希望用户通过键盘输入不同的权重和容量,而不是将整数添加到代码本身的数组中。

现在我在插入数据时遇到了编译错误。我相信问题出在 for 循环中。

import java.util.*;

public class NN01276494 {
  public static ArrayList <Double> sack = new ArrayList <Double> ();
public static void main(String [] args){
    Scanner in = new Scanner (System.in);
int i =0;
 for(i = 0; i<sack.length; i++){
 System.out.println("Enter Capacity");
 sack.size(in.nextDouble());
 }
while (in.hasNextDouble()){
System.out.print("Enter weights");
sack.add(in.nextDouble());
    i++;
}


}

public static Boolean knapsackproblem(double targetWeight, int index)
{
    Boolean complete = false;

    if(index == sack.size()) return false;
    if(sack.get(index) == targetWeight)
    {
        System.out.print("Answer: " + sack.get(index) + " ");
        complete = true;
    }; //DONE
    if(sack.get(index) < targetWeight) 
    {
        complete = knapsackproblem(targetWeight-sack.get(index), index+1);         
        if(complete) System.out.print(sack.get(index) + " ");
        for(int i = index+1; i < sack.size(); i++) 
        {
            if(!complete) complete = knapsackproblem(targetWeight, i);
        }
    }
    if(sack.get(index) > targetWeight) complete =   
    knapsackproblem(targetWeight, index+1);


    return complete;
}
}

【问题讨论】:

标签: java arrays recursion


【解决方案1】:

在 java 中接受用户输入的最常见方法是 Scanner 类。这允许您的用户输入到控制台,并且您的程序可以使用他们的输入。 Here 是详细介绍扫描仪的 javadoc,但您需要做的就是接受来自用户的整数输入:

首先,导入扫描仪字典以便您使用。

import java.util.Scanner;

这将使您能够访问扫描仪库。要构造扫描器,您需要在声明中指定输入流。要使控制台成为输入流,请像这样声明它:

Scanner nameOfScanner = new Scanner(System.in);

现在,要获取数组的整数,请根据需要多次使用方法.nextInt()。确保为每个输入单独询问用户,如果您希望用户能够控制数组的大小,您也可以询问用户。以防万一你不知道,你可以声明一个数组具有一定的大小,但直到稍后才指定每个位置的内容,如下所示:

int[] nameOfArray = new int[sizeOfArray];

另外,我注意到您在 knapsackproblem() 方法中间的 if 语句的右括号后面有一个分号。我不知道这是您的问题还是您的代码中的错字,但它确实不应该存在。

我希望这会有所帮助,祝你编码顺利!

【讨论】:

  • 额外的分号位于 if 块的末尾,而不是 for 循环的末尾。它是不必要的,应仅根据一般原则将其删除,但不会导致任何实际的编译时或运行时问题。
  • 非常感谢您的回复
【解决方案2】:

我已经修改了您的代码,因此用户可以通过 ArrayList 输入数组:-使用 ArrayList 用户可以输入数据而无需考虑长度,只需输入任意数量的值,然后在最后键入任何字母 ex:[Out ] 那么你的方法应该开始工作了:)。

import java.util.*;


public class knapsack {

public static void main(String [] args){

Scanner in = new Scanner (System.in);

System.out.println("Enter Capacity");
int y = in.nextInt();
double [] sack = new double [y];
System.out.println("enter values");

for (int i =0;i<y;i++){
sack[i]=in.nextDouble();
}


}

public static Boolean knapsackproblem(double targetWeight, int index ,
     double [] sack)
{
    Boolean complete = false;

    if(index == sack.length) return false;
    if(sack[index] == targetWeight)
    {
        System.out.print("Answer: " + sack[index] + " ");
        complete = true;
    }; //DONE
    if(sack[index] < targetWeight) 
    {
        complete = knapsackproblem(targetWeight-sack[index], index+1,sack);
 //keep going
        if(complete) System.out.print(sack[index] + " ");
        for(int i = index+1; i < sack.length; i++) 
        {
            if(!complete) complete = knapsackproblem(targetWeight, i,sack);
        }
    }
    if(sack[index] > targetWeight) complete = knapsackproblem(targetWeight,
index+1,sack);


    return complete;
}



}

希望它有所帮助。此外,我已经修复了您的递归,因为您编写了 knapsack( 而不是 knapsackproblem(.ArrayList 来自 java,util 包,其中还包括我刚刚使用的 Scanner 类 * ArrayList 是一个具有它自己的方法,如 .size() 和 .add()。

【讨论】:

  • 我在输入整数时遇到问题,它似乎是连续的,没有终点。我将如何创建一组整数,例如 5 个整数(3,10,4,6,2)。容量可以是 25(随机数)。我会调用in.nextDouble 函数 5 次还是需要一个 for 循环?
  • 正如我所说,在您在数组中输入所需的数字后,为 ex 键入任何字母:[end] 或 [false] 然后按回车键,循环将中断,您的方法将起作用。你ArrayList中不需要设置长度,
  • 如果你想设置数组长度,只需通过'in.nextDouble'从用户那里获取它,将它插入数组长度,然后使用for循环将值插入数组..'for(int i =0;i
  • 是这样的吗? public static ArrayList &lt;Double&gt; sack = new ArrayList &lt;Double&gt; (); public static void main(String [] args){ Scanner in = new Scanner (System.in); for(i = 0; i&lt;sack.length; i++){ System.out.println("Enter Capacity"); sack.size(in.nextDouble()); } while (in.hasNextDouble()){ System.out.print("Enter weights"); sack.add(in.nextDouble()); i++; }
  • 您不需要 ArrayList 然后我再次修改了您的代码,因此您可以使用插入方法参数中的常规双 [] 数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多