Java 没有使用正确的idex?
我试图实现一个子集和问题。所以基本的想法是,我们有一个容量为C的容器,还有一个容量为C的玻璃杯,我们想用C升的水来填满C。现在让我向你展示我所做的 *我将ommit类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];
容器
,因为它是一个对象,不会真正影响算法本身:
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