# PBinfo #2256 – colier1 – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: andrei

## Enunț

Se consideră n mărgele numerotate de la 1 la n de culori și grad de strălucire diferite. Se generează toate posibilitățile de construire a unui colier de m mărgele distincte, astfel încât mărgelele aflate pe poziții învecinate să fie de culori diferite. Un colier este cu atât mai prețios (valoros) cu cât suma gradelor de strălucire a mărgelelor este mai mare.

Cerință
Să se determine cel mai prețios minim lexicografic colier format.

Date de intrare
Fișierul de intrare colier.in conține pe prima linie două numere naturale n și m, iar pe următoarele n linii descrierea mărgelelor. Linia i+1 conține descrierea mărgelei i sub forma: culoare grad_stralucire. 

Date de ieșire
Fișierul de ieșire colier.out va conține pe prima linie, separate prin spațiu, cele m numere de ordine ale mărgelelor care formează colierul cel mai prețios.

Restricții și precizări

1 ≤ n ≤ 12
2 ≤ m < 10
gradul de strălucire al mărgelelor este cuprins în intervalul  [1..100]
culoarea mărgelelor este dată sub forma unui număr natural nenul <20
nu există mărgele identice
colierul este circular – prima mărgea se învecinează cu ultima

Exemplu:
colier.in

7 4
1 2 
3 2
2 1
2 3
1 3
2 2
3 1
colier.out

1 2 5 4
Explicație
Colierul format din mărgelele: 1,2,5,4 este colierul cel mai prețios minim lexicografic.
Gradul total de strălucire = 10.
Cu același grad maxim de strălucire sunt de exemplu și colierele: 1 4 5 2, 6 1 4 5.

## Cod sursă C++

```cpp
# include <fstream>
using namespace std;
ifstream f("colier.in");
ofstream g("colier.out");
struct colier{
    int g, c;
}C[101];
int st[101], sol[101], sumg[101];
bool ap[101];
int gmax, n, m;
void back(int k)
{
    for(int x=1; x<=n; ++x){
        st[k] = x;
        if (!ap[st[k]]) {
            if (k == 1 || (C[st[k]].c != C[st[k-1]].c)){
                ap[st[k]] = 1;
                sumg[k] = sumg[k-1] + C[st[k]].g;
                if (k == m) {
                    if (C[st[k]].c != C[st[1]].c) {
                        if (sumg[k] > gmax) {
                            gmax = sumg[k];
                            for(int i=1; i<=k; ++i)
                                sol[i] = st[i];
                        }
                    }
                }
                else if (k < m) back(k+1);
                ap[st[k]] = 0;
            }
        }
    }
}
int main()
{
    f >> n >> m;
    for(int i=1; i<=n; ++i){
        f >> C[i].c >> C[i].g;
    }
    back(1);
    for(int i=1; i<=m; ++i)
        g << sol[i] << " ";
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/2256)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/2256/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-2256/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
