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?