Alex_tz307

Bounded Knapsack

Nov 28th, 2020
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.77 KB | None | 0 0
  1. // https://szkopul.edu.pl/problemset/problem/klvaggzD-q4Acz_WLtkn0JXJ/site/?key=statement
  2. #include <bits/stdc++.h>
  3. #define index first
  4. #define cost second
  5.  
  6. using namespace std;
  7.  
  8. int main() {
  9.     ios_base::sync_with_stdio(false);
  10.     cin.tie(nullptr);
  11.     cout.tie(nullptr);
  12.     int N;
  13.     cin >> N;
  14.     vector < int > b(N + 1);
  15.     for(int i = 1; i <= N; ++i)
  16.         cin >> b[i];
  17.     vector < pair < int , int > > a(4096);
  18.     int M = 0;
  19.     for(int i = 1; i <= N; ++i) {
  20.         int x;
  21.         cin >> x;
  22.         int val = 1;
  23.         while(x) { // log2 trick
  24.             if(x >= val) {
  25.                 a[++M] = make_pair(i, val);
  26.                 x -= val;
  27.             }
  28.             else {
  29.                 a[++M] = make_pair(i, x);
  30.                 x = 0;
  31.             }
  32.             val <<= 1;
  33.         }
  34.     }
  35.     int K;
  36.     cin >> K;
  37.     bitset < 20001 > mark;
  38.     mark.set(0);
  39.     vector < int > dp(K + 1), dim(K + 1);
  40.     vector < vector < short > > parts(K + 2, vector < short >(1001));
  41.     for(int i = 1; i <= M; ++i) {
  42.         int val = b[a[i].index] * a[i].cost;
  43.         for(int j = K; j >= val; --j)
  44.             if(mark.test(j - val))
  45.                 if(!mark[j] || dp[j - val] + a[i].cost < dp[j]) {
  46.                     mark.set(j);
  47.                     dp[j] = dp[j - val] + a[i].cost;
  48.                     for(int x = 1; x <= dim[j - val]; ++x)
  49.                         parts[j][x] = parts[j - val][x];
  50.                     parts[j][dim[j - val] + 1] = i;
  51.                     dim[j] = dim[j - val] + 1;
  52.                 }
  53.     }
  54.     cout << dp[K] << '\n';
  55.     vector < int > sol(N + 1);
  56.     for(int i = 1; i <= dim[K]; ++i)
  57.         sol[a[parts[K][i]].index] += a[parts[K][i]].cost;
  58.     for(int i = 1; i <= N; ++i)
  59.         cout << sol[i] << ' ';
  60. }
  61.  
Advertisement
Add Comment
Please, Sign In to add comment