Cerința
Se dau n
numere naturale, unde n
este un număr par. Se grupează cele n
numere în perechi şi pentru fiecare pereche de numere se află restul împărţirii unui număr din pereche la celălalt. Se cere să se afle valoarea minimă a sumei acestor resturi.
Date de intrare
Programul citește de la tastatură numărul n
, iar apoi cele n
numere naturale, separate prin spații.
Date de ieșire
Programul va afișa pe ecran suma minimă a resturilor.
Restricții și precizări
2 ≤ n ≤ 18
- cele
n
numere citite vor fi mai mici decât1.000
Exemplu
Intrare
4 6 5 3 4
Ieșire
1
Explicație
Grupând numerele 6
cu 3
și 4
cu 5
se obțin resturile 0
, respectiv 1
. Suma lor este 1
.
#include <bits/stdc++.h> using namespace std; int n , x[20] , p[20] , a[20] , mini = 1000000000; int suma(int n) { int sum = 0; for(int i = 1 ; i < n ; i += 2) sum += max(a[x[i]] , a[x[i + 1]]) % min(a[x[i]] , a[x[i + 1]]); return sum; } void back(int k) { if(suma(k) > mini) return ; else if(k >= n) { if (suma(k) < mini) mini = suma(k); } else { int xi = 1; while (xi <= n && p[xi] == 1)xi ++; x[++ k] = xi; p[xi] = 1; for (int i = xi + 1; i <= n; i ++) { if (p[i] == 0) { p[i] = 1; x[k + 1] = i; back(k + 1); p[i] = 0; } } p[xi] = 0; } } int main() { cin >> n; for(int i = 1 ; i <= n ; i++) cin >> a[i]; sort(a + 1 , a + n + 1); back(0); cout << mini; return 0; }