Pagini recente » Cod sursa (job #127339) | Cod sursa (job #895556) | Cod sursa (job #2721906) | Cod sursa (job #2765430) | Cod sursa (job #1808691)
#include <fstream>
using namespace std;
int n, i, j, x, q[16], m, v[16], s[16], f[33000], sol=35000, lung[33000], a, sum, u[23], da;
short int tip[16];
ifstream fin("reteta.in");
ofstream fout("reteta.out");
int nr(int k){
int sol=0;
while(k>0){
sol+=(1<<k);
k--;
}
return sol;
}
int compar(int a, int b){
int x=max(lung[a], lung[b]);
if((a|b)==nr(x) && ((a&b)==0))
return 1;
return 0;
}
int pret(int i){ // i = CONFIGURATIE de reteta
int x=0;
for(int j=19;j>=0;j--)
if((i>>j) & 1) // daca medicamentul j este in CONFIGURATIA retetei, atunci
x+=u[j-1]; // la pretul retetei adaug pretul medicamentului j
return x;
}
int main(){
fin>>n>>m;
for(i=1;i<=m;i++){
fin>>tip[i]>>q[i];
for(j=0;j<q[i];j++){
fin>>x;
v[i]+=(1<<x); // v[i]= configuratia retetei i
}
}
for(i=0;i<n;i++)
fin>>u[i];
for(i=1;i<=m;i++){
s[i]=pret(v[i]);
if(tip[i]==2)
s[i]/=2;
}
while(f[0]==0){
i=m;
while(f[i]==1){
f[i]=0;
i--;
}
f[i]=1;
a=0, sum=0;
char ok=0;
lung[a]=1;
for(i=1;i<=m;i++)
if(f[i]==1){
if(compar(v[i], a)==1){
a|=v[i];
sum+=s[i];
lung[a]=max(lung[a], q[i]);
}
else{
ok=1;
break;
}
}
if(a==nr(lung[a]) && sum<sol && ok==0 )
sol=sum;
}
fout<<sol;
return 0;
}