Advertisement
Guest User

Izraz, od Vasja

a guest
Apr 23rd, 2014
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.53 KB | None | 0 0
  1. #include <iostream>
  2. #include<cstring>
  3. #include<vector>
  4. using namespace std;
  5. int dp[2][(1<<17)],cena[200];
  6. vector<int> pred[200];
  7. int main()
  8. {
  9. memset(dp,-1,sizeof(dp));
  10. long long ans=0;
  11. int n,m,k,i,j,l,a,b,o=1;
  12. cin>>n>>m;
  13. int mask=0;
  14. for(i=0;i<m;i++)
  15. {
  16. cin>>j;
  17. ans+=j;
  18. cin>>l;
  19. for(j=0;j<l;j++)
  20. {
  21. cin>>a;
  22. a--;
  23. if((mask&(1<<a))!=0) mask|=(1<<(n+a));
  24. else mask|=(1<<a);
  25. }
  26. }
  27. //
  28. cin>>k;
  29. for(i=1;i<=k;i++)
  30. {
  31. cin>>cena[i];
  32. cin>>l;
  33. for(j=0;j<l;j++)
  34. {
  35. cin>>m;
  36. pred[i].push_back(m-1);
  37. }
  38. }
  39. //
  40. dp[0][mask]=ans;
  41. ans=999999999;
  42. int now=1,prev;
  43. for(i=1;i<=k;i++){
  44.  
  45. prev=(now+1)%2;
  46. for(j=0;j<(1<<(2*n));j++)
  47. {
  48.  
  49. if(dp[prev][j]==-1) continue;
  50.  
  51. int mm=j;
  52.  
  53. if(dp[now][j]>=0) dp[now][j]=min(dp[now][j],dp[prev][j]);
  54. else dp[now][j]=dp[prev][j];
  55.  
  56. for(int z=0;z<pred[i].size();z++)
  57. {
  58. if((mm&(1<<pred[i][z]))!=0) mm|=(1<<(n+pred[i][z]));
  59. else mm|=(1<<pred[i][z]);
  60. }
  61. if(dp[now][mm]>=0) dp[now][mm]=min(dp[now][mm],dp[prev][j]+cena[i]);
  62. else dp[now][mm]=dp[prev][j]+cena[i];
  63.  
  64.  
  65. }
  66. now=(now+1)%2;
  67. }
  68. cout<<dp[(now+1)%2][(1<<(2*n))-1];
  69. return 0;
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement