【问题标题】:Not using the right idexes?没有使用正确的索引?
【发布时间】:2018-05-19 21:47:40
【问题描述】:

我正在尝试实现子集和问题。所以基本的想法是我们有一个容量为 C 的容器,还有容量为 -c- 的玻璃杯,我们想用正好 -C 升填充 C。现在让我告诉你我做了什么。

*我将省略 container 类,因为它是一个对象并且不会真正影响算法本身:

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;


    }

当我运行这个时:

    Contenitore c1 = new Contenitore("c1",1);
    Contenitore c2 = new Contenitore("c2",2);
    Contenitore c3 = new Contenitore("c3",3);



    lista_contenitori.add(c1);
    lista_contenitori.add(c2);
    lista_contenitori.add(c3);
    System.out.println(calcolaNumeroContenitori(4, lista_contenitori));

我得到结果:

Container: c2 capacity:2
Container: c1 capacity:1
2

这不是正确的答案。但是,如果您尝试在 Java 中思考,一切都从 0 开始。我的意思是,也许 4 实际上读作 3(0、1、2、3)。我到底错过了什么?

谢谢!

【问题讨论】:

    标签: java algorithm time-complexity dynamic-programming subset-sum


    【解决方案1】:

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

    特别是,您的矩阵需要包含位置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)。我不知道也许我错过了一些小东西。我现在被困了几个小时。 :(
    猜你喜欢
    • 2018-09-16
    • 1970-01-01
    • 2019-06-26
    • 2013-12-02
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多