Ecco il codice:
codice:
private static boolean ricavabile(int[] v, int x) {
boolean b[] = new boolean[v.length];
int i, exp, acc;
for(i=0; i<b.length; i++)
b[i] = false;
i=1;
exp = (int) Math.pow(2, v.length);
while(i<=exp){
acc=0;
for(int j=0; j<v.length; j++)
if(b[j]) acc+=v[j];
if(acc==x)
return true;
for(int j=0; j<v.length; j++)
if(i%(int) Math.pow(2, j)==0)
b[j] = !b[j];
i++;
}
return false;
}
Se avete suggerimenti per migliorare le prestazioni dite pure.
Avevo pensato di ordinare l'array e poi, in caso acc>x ritornare falso, ma per piccoli array il tempo utilizzato per ordinarlo è superiore al tempo risparmiato.