Vediamo 3 strategie:
1. La prima si basa sull'iterazione, cioè sul generare tutte le possibili coppie (combinazioni) e verificarne la somma (qui Python ci aiuta perché non dobbiamo scrivere il relativo codice)
2. La seconda consiste nel prelevare un elemento alla volta dalla lista e verificare se nel restante elenco è presente la differenza tra la somma obiettivo e l'elemento prelevato
3. La terza si limta a fare la scansione di tutte le somme con due cicli annidati
Delle tre la numero 2 è la più veloce, mentre la 3 è la più lenta
Codice: Seleziona tutto
from itertools import combinations as cbs
from random import randint
a = input('lista (separati da virgola): ')
somma = int(input('somma obiettivo: '))
if a != '':
lista = [int(x) for x in a.split(',')] # converte l'input in una lista
else:
lista = [randint(1,100) for _ in range(20)] # crea una lista causale di 20 elementi
somma = randint(min(lista), max(lista))
print(f'{lista=}')
print(f'{somma=}')
# Metodo con iterazione
n = True
m = []
for c in cbs(lista,2): # genera tutte ele possibili coppie
d = sorted(c)
if sum(c)==somma and d not in m: # verifica se la somma corrisponde
m.append(d); n = False # aggiunge le nuove soluzioni
if n:
print('nessuna soluzione')
else:
print(m)
# Metodo con la ricerca
n = True
m = []
for c in range(len(lista)):
d = lista.copy() # crea una copia della lista
e = d.pop(c) # estrare il numero in posizione c
f = sorted([e, somma-e])
if somma-e in d and f not in m: # verifica se la differenza è presente nella lista rimanente
m.append(f); n = False # aggiunge le nuove soluzioni
if n:
print('nessuna soluzione')
else:
print(m)
# Metodo con la scansione
n = True
m = []
for c in range(len(lista)):
for d in range(len(lista)):
if c!=d:
e = sorted([lista[c],lista[d]])
if sum(e)==somma and e not in m: # verifica se la somma corrisponde
m.append(e); n = False # aggiunge le nuove soluzioni
if n:
print('nessuna soluzione')
else:
print(m)


