3790 - subsets
Sursa: - subsets
Cerinţa
Se dă șirul a1, a2, …, an de numere naturale nenule distincte. Vrem să alegem trei submulțimi X, Y și Z cu proprietățile:
- submulțimile sunt nevide
- orice element din șir aparține cel mult unei submulțimi
- cele trei submulțimi au suma elementelor identică
De exemplu, dacă a = (1,2,3,4,5,6), atunci putem alege submulțimile: X={1,4}, Y={2,3}, Z={5}. Se observă că au toate suma elementelor egală cu 5 și că 6 nu apare în niciuna din submulțimi. O altă alegere este X={1,6}, Y={2,5}, Z={3,4} și în acest caz toate submulțimile au suma 7 și toate elementele șirului aparțin uneia dintre submulțimi.
Reținem faptul că ordinea elementelor într-o submulțime nu contează, deci X={1,4} este totuna cu X={4,1}. De asemenea, ordinea celor trei submulțimi nu contează, adică de exemplu X={1,4}, Y={2,3}, Z={5} înseamnă același triplet cu X={2,3}, Y={1,4}, Z={5}.
Să se determine numărul tripletelor de submulțimi care îndeplinesc proprietățile.
Date de intrare
Programul citește de la tastatură numărul n, iar apoi n cele numere naturale a1, a2, …, an, separate prin spații.
Date de ieșire
Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt corecte.", iar apoi va afișa pe ecran numărul tripletelor de submulțimi. În caz contrar, se va afișa pe ecran: "Datele nu sunt comform restricțiilor impuse.".
Restricţii şi precizări
- 3 ≤ n ≤ 10
- cele n numere din șir vor fi nenule, distincte două câte două și mai mici decât 100
Exemple
Exemplul 1
- Intrare
- 6
- 1 2 3 4 5 6
- Ieșire
- Datele sunt corecte.
- 3
Exemplul 2
- Intrare
- 5
- 1 2 3 4 7
- Ieșire
- Datele sunt corecte.
- 0
Exemplul 3
- Intrare
- 2
- 314515341535441 412351541241
- Ieșire
- Datele nu sunt comform restricțiilor impuse.
Rezolvare
<syntaxhighlight lang="python" line>
- 3790 - subsets
def numara_tripleturi(n, vector):
def verifica_suma_egala(submultimi):
sume = []
for submultime in submultimi:
sume.append(sum(submultime))
return len(set(sume)) == 1
def backtracking(index, submultimi):
nonlocal numar
if index == n:
if len(submultimi[0]) > 0 and len(submultimi[1]) > 0 and len(submultimi[2]) > 0 and verifica_suma_egala(submultimi):
numar += 1
return
for i in range(3):
submultimi[i].append(vector[index])
backtracking(index + 1, submultimi)
submultimi[i].pop()
numar = 0 submultimi = [[], [], []] backtracking(0, submultimi) return numar // 2
def conform_restrictiilor(n,vector):
if not 3 <= n <= 10:
print("Datele nu sunt conform restricțiilor impuse.")
return False
for x in vector:
if x > 100 or x == 0:
print("Datele nu sunt conform restricțiilor impuse.")
return False
print("Datele sunt corecte.")
return True
if __name__ == '__main__':
n = int(input())
vector = list(map(int, input().split()))
if conform_restrictiilor(n,vector) is True:
rezultat = numara_tripleturi(n,vector)
print(rezultat)
</syntaxhighlight>