Java 用递归和数组求解背包问题
我想知道修改此代码的最佳方法。我希望用户通过键盘输入不同的权重和容量,而不是将整数添加到代码本身的数组中 现在我在插入数据时出现编译错误。我相信问题在for循环中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){
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];
在一个单独的注释中,我注意到,在
我希望这有帮助,祝你好运 我已经修改了您的代码,以便用户可以通过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;
}
}