Ho bisogno di una cosa un po' strana a cui non riesco a venirne fuori, vorrei solo sapere come farlo a livello logico, che poi per la codifica ci penso io.
Io ho un valore e un array, ad esempio
int x = 8;
int v[] = {4, 7, 3, 1};
vorrei sapere, tramite il codice, se è possibile ottenere il valore x sommando i numeri nel vettore v.
Nell'esempio, questo ipotetico metodo, dovrebbe ritornare vero poiché 4 + 3 + 1 = 8
Ma se invece x=9; allora dovrebbe ritornare falso perché non c'è nessuna combinazione la cui somma dà 9.
A livello di analisi, ho creato un metodo ricorsivo che, però, va in loop ricevendo un errore di stack overflow, il metodo è il seguente:
codice:
private static boolean existValueC(int x) {
int k;
for(k=x; k>0; k--){
if(k!=(x-k)){
if(map.containsValue(k)&&map.containsValue(x-k))
return true;
}
else if(containsTwoTimes(k))
return true;
}
for(k=x; k>0; k--)
if(existValueC(x)&&map.containsValue(x-k))
return true;
for(k=x; k>0; k--)
if(map.containsValue(k)&&existValueC(x-k))
return true;
for(k=x; k>0; k--)
if(existValueC(k)&&existValueC(x-k))
return true;
return false;
}
private static boolean containsTwoTimes(int k) {
map.put(getKeyByValue(map, k), 0);
return map.containsValue(k);
}
public static <T, E> T getKeyByValue(Map<T, E> map, E value) {
for (Entry<T, E> entry : map.entrySet()) {
if (value.equals(entry.getValue())) {
return entry.getKey();
}
}
return null;
}
Il fatto che sia una map o un array è irrilevante.
Potete aiutarmi?