Dato il numero 15
e l'array [1, 2, 3, 4, 5, 6]
Le possibili combinazioni (somma = 15) sarebbero:
[1, 2, 3, 4, 5]
[2, 3, 4, 6]
[1, 3, 5, 6]
[4, 5, 6]
La loro rispettiva somma di quadrati sarebbe:
55, 65, 71 e 77
Qualsiasi numero nell'array può essere utilizzato una sola volta in una qualsiasi combinazione di numeri (nessun numero ripetuto). La soluzione sarebbe la combinazione numerica con la più piccola somma di quadrati (cioè 55)
Quale potrebbe essere una logica efficiente per risolvere questo problema?
Finora, ho provato questo:
Nested for loops:
for (j=0; j<arrLength; j++){
sum = 0;
for (i=j; i<arrLength; i++){
sum+=arrNumbers[i];
if (sum >= 15) {break;}
}
}
if (sum == 15) {
for(j=j; j<=i; j++){
printf("%d ", arrNumbers[j]);
}
Tuttavia, questo non sempre dà i risultati corretti perché controlla solo le combinazioni di numeri in successione (ad esempio [1, 2, 3], [2, 3, 4], [3, 4, 5])
Dopo ho provato questo:
for (j=0; j<arrLength; j++){
sum = 0;
for (k=j; k<arrLength; k++){
if (sum == 15) {break;}
sum=arrNumbers[j];
for (i=k+1; i<arrLength; i++){
sum+=arrNumbers[i];
if (sum >= 15) {break;}
}
}
if (sum >= 15) {break;}
}
if(sum==15){
//print number combinations here
}
Non ha funzionato neanche come ho appreso in seguito che non è molto diverso dalla prima soluzione e la mia logica è imperfetta.
Ciò di cui sto avendo problemi è il tentativo di pensare a una logica che itera attraverso tutti i numeri nell'array (indipendentemente dall'ordine) per trovare combinazioni che si sommano al numero 15.
Ad esempio, il mio codice può trovare queste combinazioni se sono in ordine sequenziale [1, 2, 3, 4, 5]
o [4, 5, 6]
ma non riesce a trovare qualcosa come [1, 3, 5, 6]
.