Java 没有使用正确的idex?

Java 没有使用正确的idex?,java,algorithm,time-complexity,dynamic-programming,subset-sum,Java,Algorithm,Time Complexity,Dynamic Programming,Subset Sum,我试图实现一个子集和问题。所以基本的想法是,我们有一个容量为C的容器,还有一个容量为C的玻璃杯,我们想用C升的水来填满C。现在让我向你展示我所做的 *我将ommit类容器,因为它是一个对象,不会真正影响算法本身: public static int calcolaNumeroContenitori(int C, ArrayList<Contenitore> p) { boolean B[][] = new boolean[p.size()][C];

我试图实现一个子集和问题。所以基本的想法是,我们有一个容量为C的容器,还有一个容量为C的玻璃杯,我们想用C升的水来填满C。现在让我向你展示我所做的

*我将ommit类
容器
,因为它是一个对象,不会真正影响算法本身:

public static int calcolaNumeroContenitori(int C, ArrayList<Contenitore> p)
    {

        boolean B[][] = new boolean[p.size()][C];
        boolean U[][] = new boolean[p.size()][C];

        B[0][0] = true; 
        U[0][0] = false;
        int num_cont = 0;
        int j;
        int i;
        //prima riga - caso base
        for( j = 0; j < C; j++)
        {
            if(j == p.get(0).getCapienza())
            {
                B[0][j] = true;
                U[0][j] = true;
             }
            else
            {
                B[0][j] = false;
                U[0][j] = false;
            }
        }
        //caso generale
        for(i = 1; i < p.size(); i++)
        {
            for(j = 0; j < C; j++)
            {
                if(j >= p.get(i).getCapienza())
                {
                    B[i][j] = B[i-1][j] || B[i-1][j - p.get(i).getCapienza()];
                    U[i][j] = B[i-1][j-p.get(i).getCapienza()];
               }
                else
                { 
                     B[i][j] = B[i-1][j];
                     U[i][j] = false;
                }
            }
        }

        if(!B[p.size()-1][C-1])
            {
                System.out.println("-1");
            }else
            {

                i = p.size()-1;
                j = C-1;
                while( i >= 0 && j >= 0)
                {
                    if(U[i][j])
                    {
                        num_cont++;
                        System.out.println("Usato: "+p.get(i).getId()
                                +" capienza:" + p.get(i).getCapienza());
                        j = j - p.get(i).getCapienza();
                    }
                    i--;
                }
             }
           return num_cont;


    }
我得到的结果是:

Container: c2 capacity:2
Container: c1 capacity:1
2
这不是正确的答案。但是如果你试着用Java思考,一切都从0开始。我的意思是,也许4实际上读作3(0,1,2,3)。我到底错过了什么


谢谢大家!

您显然已经诊断出了这个问题,但可能没有详细的诊断。问题确实是由于数组中的最高索引比其长度小一


特别是,矩阵需要包含位置
C
,因此其维度必须为
C+1
。例如这里:
j=C-1
这里:
B[p.size()-1][C-1]
您将搜索是否可以通过添加容器来达到值
C-1
,这显然比实际目标小1。

您好,感谢您的更新。我试图修改代码,但做不到。也许,将+1和C相加不是正确的方法,因为如果实际上C=5,在算法中我将其设置为C=6,只是为了包含5,C的大小将为6(0,1,2,3,4,5)。我不知道也许我错过了一些小东西。这件事我已经耽搁了好几个小时了(
Container: c2 capacity:2
Container: c1 capacity:1
2