Java 用递归和数组求解背包问题

Java 用递归和数组求解背包问题,java,arrays,recursion,Java,Arrays,Recursion,我想知道修改此代码的最佳方法。我希望用户通过键盘输入不同的权重和容量,而不是将整数添加到代码本身的数组中 现在我在插入数据时出现编译错误。我相信问题在for循环中 import java.util.*; public class NN01276494 { public static ArrayList <Double> sack = new ArrayList <Double> (); public static void main(String [] args){

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

现在我在插入数据时出现编译错误。我相信问题在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;
}
}
import java.util.*;
公共类NN01276494{
publicstaticarraylistsack=newarraylist();
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(系统输入);
int i=0;
对于(i=0;i目标重量)完整=
背包问题(目标重量,索引+1);
返回完成;
}
}

在java中接受用户输入的最常见方式是Scanner类。这允许您的用户输入控制台,您的程序使用他们的输入。是详细说明扫描仪的javadoc,但要接受用户的整数输入,您只需执行以下操作:

首先,导入scanner字典以便使用它

import java.util.Scanner;
这将允许您访问扫描仪库。要构造扫描仪,需要在声明中指定输入流。要使控制台成为此输入流,请这样声明:

Scanner nameOfScanner = new Scanner(System.in);
现在,要获取数组的整数,请根据需要多次使用方法
.nextInt()
。确保分别向用户询问每个输入,如果您希望用户能够控制阵列的大小,也可以向用户询问。如果您不知道,您可以声明一个数组具有一定的大小,但在以后之前不要指定每个位置中的内容,如下所示:

int[] nameOfArray = new int[sizeOfArray];

在一个单独的注释中,我注意到,在 KnApple问题()/Cux>方法的中间,if语句的结尾括号后面有分号。我不知道这是你的问题中的一个输入错误还是你的代码中的一个输入错误,但它真的不应该存在


我希望这有帮助,祝你好运

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

import java.util.*;
公务舱背包{
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(系统输入);
系统输出打印项次(“输入容量”);
int y=in.nextInt();
double[]sack=新的double[y];
System.out.println(“输入值”);
对于(int i=0;i targetWeight)complete=背包问题(targetWeight,
指数+1,sack);
返回完成;
}
}

希望有帮助。另外,自从您编写背包后,我已经修复了您的递归(而不是背包问题(.ArrayList来自java,util包还包括我刚刚使用的Scanner类,*ArrayList是一个类,它有自己的方法,如.size()和.add().

更适合于?@AndyTurner THX额外的分号位于if块的末尾,而不是for循环。它是不必要的,应该根据一般原则删除,但它不会导致任何实际的编译时或运行时问题。非常感谢您的响应。我在输入整数时遇到问题,它似乎是连续的h不是终点。我如何创建一组整数,例如5个整数(3,10,4,6,2)。容量可以是25(随机数)。我会调用
in.nextDouble
函数5次还是需要一个for循环?正如我在数组中输入所需的数字后所说的,键入任何字母for ex:[end]或[false]然后按enter键,循环将中断,您的方法将工作。您不需要在ArrayList中设置长度,如果要设置数组长度,只需通过“in.nextDouble”从用户处获取它,将其插入数组长度,然后使用for循环将值插入数组中(inti=0;iIs是这样的?
publicstaticarraylistsack=newarraylist();publicstaticvoidmain(String[]args){Scanner in=newscanner(System.in);用于(i=0;i您不需要ArrayList,然后我再次修改了您的代码,这样您就可以使用插入到方法参数中的常规double[]数组。
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;
}



}