Advertisement
Guest User

Pakowanie by Psyho

a guest
May 14th, 2014
369
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.96 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. //#include <emmintrin.h>
  3.  
  4. using namespace std;
  5.  
  6. #define FORE(it,c)  for(__typeof((c).begin()) it = (c).begin(); it != (c).end(); ++it)
  7. #define FOR(i,a,b)  for(int i=(a);i<(b);++i)
  8. #define REP(i,a)    FOR(i,0,a)
  9. #define ZERO(m)    memset(m,0,sizeof(m))
  10. #define ALL(x)      x.begin(),x.end()
  11. #define PB          push_back
  12. #define S          size()
  13. #define LL          long long
  14. #define ULL        unsigned long long
  15. #define LD          long double
  16. #define MP          make_pair
  17. #define X          first
  18. #define Y          second
  19. #define VC          vector
  20. #define PII        pair <int, int>
  21. #define VI          VC < int >
  22. #define VVI        VC < VI >
  23. #define VD          VC < double >
  24. #define VVD        VC < VD >
  25. #define VS          VC < string >
  26. #define DB(a)      cerr << #a << ": " << (a) << endl;
  27.  
  28. template<class T> void print(VC < T > v) {cerr << "[";if (v.S) cerr << v[0];FOR(i, 1, v.S) cerr << ", " << v[i];cerr << "]\n";}
  29. template<class T> string i2s(T x) {ostringstream o; o << x; return o.str(); }
  30. VS splt(string s, char c = ' ') {VS all; int p = 0, np; while (np = s.find(c, p), np >= 0) {if (np != p) all.PB(s.substr(p, np - p)); p = np + 1;} if (p < s.S) all.PB(s.substr(p)); return all;}
  31.  
  32. unsigned int dp[1<<24];
  33. unsigned int a[24];
  34. unsigned int c[100];
  35.  
  36. const unsigned int MAXW = 1<<27;
  37. const unsigned int MAX_INT = -1;
  38.  
  39. int main() {
  40.     int n, m;
  41.     cin >> n >> m;
  42.     REP(i, n) cin >> a[i];
  43.     REP(i, m) cin >> c[i];
  44.     sort(c, c + m);
  45.     reverse(c, c + m);
  46.    
  47.     memset(dp, 0xFF, sizeof(dp));
  48.     dp[0] = 0;
  49.    
  50.     REP(i, 1<<n) {
  51.         if (dp[i] == MAX_INT) continue;
  52.         unsigned int x = dp[i] >> 27;
  53.         unsigned int w = dp[i] & (MAXW-1);
  54.         REP(j, n) if ((i & (1 << j)) == 0) {
  55.             unsigned int z = w + a[j] > c[x] ? (a[j] > c[x+1] ? MAX_INT : ((x+1)<<27)+a[j]) : (x<<27)+w+a[j];
  56.             dp[i+(1<<j)] = min(dp[i+(1<<j)], z);
  57.         }
  58.     }
  59.    
  60.     int r = ((dp[(1<<n)-1]/MAXW)+1);
  61.     if (r == 32) cout << "NIE"; else cout << r;
  62.     cout << endl;
  63.     return 0;
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement