Der beste Weg, um eine Anzahl von Listenelementen zu erhalten, deren Wertesumme einem konstanten Wert entsprichtMySql

MySQL DBMS-Forum
Anonymous
 Der beste Weg, um eine Anzahl von Listenelementen zu erhalten, deren Wertesumme einem konstanten Wert entspricht

Post by Anonymous »

Ich habe eine Liste, die aus numerischen Werten besteht:
In Python wird sie wie folgt geschrieben:

Code: Select all

[959, 3480, 9346, 8367, 2847, 8330, 6946, 9586, 9722, 2775]
Oder im Fall von MySQL:

Code: Select all

create table testtb(n int);
insert into testtb values(959),(3480),(9346),(8367),(2847),(8330),(6946),(9586),(9722),(2775);
Ich würde gerne die Elemente mit einem Summenwert von 43219 aus der Liste finden.
Ich glaubte, dass SQL möglicherweise nicht die beste Wahl sei, also habe ich mich für die Programmierung entschieden und es abgeschlossen.
Hier ist, wie ich es in Python mit dem folgenden Skript gemacht habe:

Code: Select all

import random
ls=[959, 3480, 9346, 8367, 2847, 8330, 6946, 9586, 9722, 2775]
length=len(ls)

flag=True
while flag:
new_ls=random.sample(ls,length) #get a list with the same elements but in different order
print(f'\n\na new list with the following combination begins: {new_ls}')
total=0
index=0
for n in new_ls:
total=total+n
if total>43219:  #there is no need to keep on using the current list
break
elif total==43219:  #found the answer
print(f'\nfound the combination:{new_ls[:index+1]}')
print(f'it has a length of {index+1}')
print(f'the sorted list is:{sorted(new_ls[:index+1])}')
flag=False
break
index+=1

Nachdem ich das Skript ausgeführt hatte, erhielt ich nach einigen fehlgeschlagenen Kombinationen die Antwort:

Code: Select all

a new list with the following combination begins: [8330, 9346, 8367, 9722, 959, 9586, 2847, 3480, 6946, 2775]

a new list with the following combination begins: [6946, 2847, 2775, 959, 8367, 8330, 3480, 9346, 9586, 9722]

a new list with the following combination begins: [2775, 3480, 959, 8367, 9586, 9722, 8330, 6946, 9346, 2847]

found the combination:[2775, 3480, 959, 8367, 9586, 9722, 8330]
it has a length of 7
the sorted list is:[959, 2775, 3480, 8330, 8367, 9586, 9722]
Natürlich könnte das Ähnliche auch in MySQL erfolgen. Eine temporäre Tabelle kann erstellt werden mit:

Code: Select all

select n from testtb order by random;
Dann verwenden Sie einen Cursor, um den Wert aus jeder Zeile abzurufen und sie einzeln hinzuzufügen. Und vergleichen Sie die Summe mit dem konstanten Wert.
In jedem Fall besteht das Problem darin, dass die Auflösung von zu viel Zufälligkeit abhängt. Gibt es einen besseren Weg, dies zu erreichen? (sei es Python oder MySQL)

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post