Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 7th, 2012  |  syntax: C++  |  size: 3.18 KB  |  hits: 15  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. #include <iostream>
  2. #include<cstring>
  3. #include<vector>
  4. using namespace std;
  5. // ja koristam taka dp nizata bidejki [200][1<<17] pagja na memorija
  6. int dp[2][(1<<17)],cena[200];
  7. vector<int> pred[200];
  8. int main()
  9. {
  10.     //dinamickoto mi e dp[do koj covek][maska]
  11.     // maskata mi oznacuva po koj predmet imame zemeno profesor
  12.     // bidejki ima 8 predmeti a treba po 2 profesori
  13.     // a bitovite se samo 0 i 1
  14.     // kje zemam 2^16 maska
  15.     // i pocnuvame so 000000000000000 maska, ako zemam profesor za prviot
  16.     // kje stane 100000000000000, ako zemam za 4tiot
  17.     // 100100000000000, ako zemam use eden za prviot kje go smenam i 9tiot bit(8+1)
  18.     // 100100001000000, taka mi raboti dinamickoto
  19.     memset(dp,-1,sizeof(dp));
  20.     long long ans=0;
  21.     int n,m,k,i,j,l,a,b,o=1;
  22.     cin>>n>>m;
  23.     int mask=0;
  24.     // bidejki imame dadeno deka profesori morat da rabotat
  25.     // gi stavame predmetite koj sto gi predavat vo pocetnata maska
  26.     // i parite gi stavame vo rezultat
  27.     for(i=0;i<m;i++)
  28.     {
  29.         cin>>j;
  30.         ans+=j;
  31.         cin>>l;
  32.         for(j=0;j<l;j++)
  33.         {
  34.             cin>>a;
  35.             a--;
  36.             if((mask&(1<<a))!=0)  mask|=(1<<(n+a)); // ako ima vekje eden profesor go dodavame n+a-tiot bit
  37.             else mask|=(1<<a);// ako nema profesor za toj predmet obicno go menuvame bitot samo
  38.         }
  39.     }
  40.     cin>>k;
  41.     for(i=1;i<=k;i++)
  42.     {
  43.         cin>>cena[i];
  44.         cin>>l;
  45.         for(j=0;j<l;j++)
  46.         {
  47.             cin>>m;
  48.             pred[i].push_back(m-1);
  49.         }
  50.     }
  51.     dp[0][mask]=ans;
  52.     //
  53.     ans=999999999;
  54.     int now=1,prev; // bidejki gi menam redovite deka pagja na memorija gi iam deklarirano ovie
  55.     // za vrtenje na redovite
  56.     for(i=1;i<=k;i++) // gi izminuvam site profesori
  57.     {
  58.         prev=(now+1)%2; // mislam deka sfakjas kako odi shiftanjeto na redovite.. :D
  59.         for(j=0;j<(1<<(2*n));j++) // od 0 do 2^16, izminuvam za maskata
  60.         {
  61.             if(dp[prev][j]==-1) continue; // ako nemam od prethodniot red za taa maska ne dodavam
  62.             int mm=j;// inicijaliziram ja maskata na druga promenliva da ne zaebam
  63.             // ako sme stignale za taa maska (mm) gledame podobro resenie od prethodniot red
  64.             // i segasniot
  65.             if(dp[now][j]>=0) dp[now][j]=min(dp[now][j],dp[prev][j]);
  66.             // ako nema samo go stavame od prethodniot red
  67.             else dp[now][j]=dp[prev][j];
  68.             for(int z=0;z<pred[i].size();z++) // gi vrtime predmetite sto gi predava
  69.             {
  70.                 // gi dodavam vo maskata predmetite
  71.                 // ako e zafateno prviot bit,n+predmetot
  72.                 // else prviot bit da go smene
  73.                 if((mm&(1<<pred[i][z]))!=0)  mm|=(1<<(n+pred[i][z]));
  74.                 else mm|=(1<<pred[i][z]);
  75.             }
  76.             //ako sme stavile rezultat za maskata sto ja izgradivme
  77.             // go zimame podobriot rezultat
  78.             // else go stavame toj sto sme go dobile
  79.             if(dp[now][mm]>=0) dp[now][mm]=min(dp[now][mm],dp[prev][j]+cena[i]);
  80.             else dp[now][mm]=dp[prev][j]+cena[i];
  81.         }
  82.         now=(now+1)%2;
  83.     }
  84.     cout<<dp[(now+1)%2][(1<<(2*n))-1];
  85.     return 0;
  86. }