[Algoritmi] Soluzione ammissibile

simoselva1
Salve a tutti, premetto che non so se ho inserito la domanda nel posto giusto, in ogni caso scrivo.
Ho il seguente problema: data la seguente equazione

Res = (2x1 + 4x2 + 6x3 + 10x4 + 15x5 + 20x6 + 25x7)

vorrei sapere se è possibile, dato un certo Res, determinare se esiste almeno una soluzione.
Sia Res che le varie x possono assumere solo valori interi.

In alternativa alla soluzione matematica mi andrebbe bene anche un algoritmo, tra i vari che ho provato quello che "funziona" meglio è il seguente ma per alcuni valori non restituisce il valore giusto
BYTE values [7] =  {2, 4, 6, 10, 15, 20, 25}; 

bool checkWin(DWORD toWin, BYTE idx)
{
	bool res;
	WORD bet = Game_getTotBet();

	WORD val = toWin/(values[idx]*bet);
	WORD resto = toWin%(values[idx]*bet);

	if (resto && val)
		resto = toWin - values[idx]*bet;

	for (BYTE i = 0; i < 6; i++)
	{
		if ( (toWin % (values[i]*bet)) == 0 )
			return true;
	}

	if (resto == 0)
		res = true;
	else if ( resto != toWin && idx < 6)
		res = checkWin(resto, idx + 1);		
	else if ( resto == toWin )
		res = checkWin(toWin - (values[idx]*bet), 0);
	else
		res = false;	

	return res;
}


per testarlo con i valori che mi servono lo chiamo così:

BYTE num = (rand()%250) + 1;
checkWin(num*100, 0);


Grazie in anticipo, Simone.

Risposte
nab2
L'equazione che fornisci $Res = 2x_1 + 4x_2 + 6x_3 + 10x_4 + 15x_5+20x_6+25x_7$
Può essere riscritta come $Res = 2(x_1 + 2x_2 + 3x_3 +5x_4 + 10x_6)+5(3x_5+5x_7)$

Se $Res = 0$ vuol dire che ogni coefficiente è $0$.
Se $Res$ è pari allora $x_1 = \frac{Res}{2}$ e tutte le altre $x$ hanno valore zero.
Se $Res$ è dispari allora $x_1 = \frac{Res-15}{2}$ e $x_5 = 1$ e tutte le altre $x$ hanno valore zero.

Il tutto vale anche per valori di $Res$ negativi.
Quindi sì, esiste sempre almeno una soluzione con valori interi per le $x$.

Esempio:
$Res = 234567$
Dato che è dispari, si avrà che $x_1 = \frac{234567-15}{2}$ e $x_5 = 1$ con tutte le altre $x$ a zero.

simoselva1
Grazie mille, con un paio di accorgimenti funziona alla grande!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.