285
Gigel trebuie să cumpere n medicamente, numerotate de la 1 la n. Doctorul i-a dat m rețete de două tipuri, codificate cu numerele 1, 2 astfel:
Exemplu
reteta1.in
4 5 2 1 3 2 2 2 3 1 1 1 1 3 4 1 2 1 1 3 8 20 2 16
reteta1.out
45.0
Explicație
Soluţia s-a obţinut prin folosirea primei şi celei de a patra reţete. O altă soluţie, dar de cost mai mare, s-ar fi obţinut dacă se folosea reţeta a patra şi cea de a cincea.
#include <bits/stdc++.h>
using namespace std;
ifstream cin("reteta1.in");
ofstream cout("reteta1.out");
int n , m , A[21] , X[21];
double mini = 10000001;
struct poz
{
int c , n , a[21];
double val;
}r[21];
int afisare(int k)
{
for(int i = 1 ; i <= k ; i++)
cout << X[i] << " ";
cout << '\n';
}
void alegemin(int k)
{
/*for(int i = 1 ; i <= k ; i++)
cout << X[i] << " ";
cout << endl;*/
double v = 0;
int ok = 0 , f[21] = {0};
for(int i = 1 ; i <= k ; i++)
{
v += r[X[i]].val;
for(int j = 1 ; j <= r[X[i]].n ; j++)
f[r[X[i]].a[j]]++;
}
/*for(int j = 1 ; j <= n ; j++)
cout << f[j] << " ";
cout << endl;*/
for(int j = 1 ; j <= n ; j++)
if(f[j] != 1) ok = 1;
if(ok == 0 && v < mini) mini = v;
}
void back(int k)
{
for(int i = X[k - 1] + 1 ; i <= m ; i++)
{
X[k] = i;
alegemin(k);
back(k + 1);
}
}
int main()
{
cin >> n >> m;
for(int i = 1 ; i <= m ; i++)
{
cin >> r[i].c >> r[i].n;
for(int j = 1 ; j <= r[i].n ; j++)
cin >> r[i].a[j];
}
for(int i = 1 ; i <= n ; i++)
cin >> A[i];
for(int i = 1 ; i <= m ; i++)
{
r[i].val = 0;
for(int j = 1 ; j <= r[i].n ; j++)
if(r[i].c == 1)
r[i].val += A[r[i].a[j]];
else
r[i].val += A[r[i].a[j]] / 2.0;
}
back(1);
cout << fixed << setprecision(1) << mini;
}
Comentarii