我是java编程的初学者,我试图通过动态编程来实现背包算法,它可以很好地工作在很少的输入上,但是对于很少的输入,它会抛出异常,代码是
package knapsack3;
import java.util.Scanner;
/** Class Knapsack **/
public class knapsack3
{
public void solve(int wt[], int val[], int M, int n)
{
int nob = 25;
int i,j;
int v[][]=new int[nob][nob];
for(i=0;i<=n;i++)
{
for(j=0;j<=M;j++)
{
if(i==0||j==0)
{
v[i][j]=0;
}
else if(j-wt[i]<0)
{
v[i][j]=v[i-1][j];
}
else
{
v[i][j]=Math.max(v[i-1][j],val[i]+v[i-1][j-wt[i]]);
}
}
}
System.out.println("\n Final Profit(value)---> "+v[n-1][M]);
}
/** Main function **/
public static void main (String[] args)
{
Scanner scan = new Scanner(System.in);
System.out.println("Knapsack Algorithm Test\n");
knapsack3 ks = new knapsack3();
System.out.println("Enter number of elements ");
int n = scan.nextInt();
int wt[] = new int[n + 1];
int val[] = new int[n + 1];
System.out.println("\nEnter weight for "+ n +" elements");
for (int i = 1; i <= n; i++)
wt[i] = scan.nextInt();
System.out.println("\nEnter value for "+ n +" elements");
for (int i = 1; i <= n; i++)
val[i] = scan.nextInt();
System.out.println("\nEnter knapsack weight ");
int M = scan.nextInt();
ks.solve(wt, val, M, n);
scan.close();
}
}例外是
线程"main“中的异常java.lang.ArrayIndexOutOfBoundsException: 25 at knapsack3.knapsack3.解决(knapsack3.java:22)在knapsack3.knapsack3.main(knapsack3.java:61)
发布于 2014-08-08 18:14:26
因为你的数组
int nob = 25;
int v[][]=new int[nob][nob];是硬编码到25大小,但您随后使用了一个for循环,该循环将转到n和M (因此,如果您为n或M输入一个大于nob aka 25的数字,那么您将得到一个超出界限的异常。
您的for-循环应该始终像这样使用它们中的数组。
for(int i = 0; i < v.length; i++)
{
for(int j = 0; j < v[i].length; j++){}
}以避免这个问题。
然而,编辑您真正的问题,现在我要看的问题是,您的for-循环这样做:
for(int i = 0; i <= n; i++)如果i <= n从0开始,您将运行此循环26次(而不是25次)。因为我假设您的n是25,从硬编码的nob到25。
也是
for(int j = 0; j <= M; j++)这意味着您将从0到M(背包大小),我假设它几乎总是在25以上,所以这总是会导致超出界限的异常,因为您硬编码数组的大小。
https://stackoverflow.com/questions/25209549
复制相似问题