首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组超出了java异常的范围。

数组超出了java异常的范围。
EN

Stack Overflow用户
提问于 2014-08-08 18:01:46
回答 1查看 177关注 0票数 0

我是java编程的初学者,我试图通过动态编程来实现背包算法,它可以很好地工作在很少的输入上,但是对于很少的输入,它会抛出异常,代码是

代码语言:javascript
复制
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)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-08 18:14:26

因为你的数组

代码语言:javascript
复制
int nob = 25;
int v[][]=new int[nob][nob];

是硬编码到25大小,但您随后使用了一个for循环,该循环将转到nM (因此,如果您为nM输入一个大于nob aka 25的数字,那么您将得到一个超出界限的异常。

您的for-循环应该始终像这样使用它们中的数组。

代码语言:javascript
复制
for(int i = 0; i < v.length; i++)
{
    for(int j = 0; j < v[i].length; j++){}
}

以避免这个问题。

然而,编辑您真正的问题,现在我要看的问题是,您的for-循环这样做:

代码语言:javascript
复制
for(int i = 0; i <= n; i++)

如果i <= n从0开始,您将运行此循环26次(而不是25次)。因为我假设您的n是25,从硬编码的nob到25。

也是

代码语言:javascript
复制
for(int j = 0; j <= M; j++)

这意味着您将从0到M(背包大小),我假设它几乎总是在25以上,所以这总是会导致超出界限的异常,因为您硬编码数组的大小。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25209549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档