【发布时间】: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