Advertisement
Guest User

Untitled

a guest
Feb 18th, 2020
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.87 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long tint;
  6.  
  7. #define forsn(i, s, n) for(int i=s;i<int(n);i++)
  8. #define forn(i, n) forsn(i, 0, n)
  9. #define all(v) v.begin(),v.end()
  10. #define rall(v) v.rbegin(), v.rend()
  11. #define NACHO ios::sync_with_stdio(0); cin.tie(NULL);
  12.  
  13. const int INF = 1111122222;
  14. const int MOD = 1e9+7;
  15.  
  16. struct info{
  17.     int id, buy, tot;
  18. };
  19.  
  20. int dp[21][1205][1205];
  21. int S[21][1205];
  22. int tam[21];
  23. info vengo[21][1205][1205];
  24.  
  25. int main(){
  26.     NACHO;
  27.     ifstream cin("zapallos.in");
  28.     ofstream cout("zapallos.out");
  29.     int n, w; cin >> n >> w;
  30.     forn(i, n){
  31.         int k; cin >> k;
  32.         tam[i] = k;
  33.         vector<int> p (k);
  34.         forn(j, k){
  35.             cin >> p[j];
  36.             p[j] = 10-p[j];
  37.         }
  38.         forsn(j, 1, k+1){
  39.             S[i][j] = S[i][j-1]+p[j-1];
  40.         }
  41.     }
  42.     forn(i, n){
  43.         forn(j, w+1){
  44.             forn(k, w+1){
  45.                 dp[i][j][k] = -100;
  46.             }
  47.         }
  48.     }
  49.     forn(i, min(w, tam[0])+1){
  50.         dp[0][i][i] = S[0][i];
  51.     }
  52.     forn(i, n){
  53.         forn(j, w+1){
  54.             forn(k, w+1){
  55.                 vengo[i][j][k] = {-1,-1,-1};
  56.             }
  57.         }
  58.     }
  59.     forsn(i, 1, n){
  60.         forn(j, min(w, tam[i])+1){
  61.             forn(k, min(w, tam[i-1])+1){
  62.                 forn(l, w+1){
  63.                     if(j+k+l <= w){
  64.                         if(dp[i-1][k][k+l]+S[i][j] > dp[i][j][k+j+l]){
  65.                             dp[i][j][j+k+l] =  S[i][j]+dp[i-1][k][k+l];
  66.                             vengo[i][j][j+k+l] = {i-1, k, k+l};
  67.                         }
  68.                     }
  69.                 }
  70.             }
  71.         }
  72.     }
  73.     int best = -1, cant = 0, comproUlt = 0;
  74.     forn(i, min(tam[n-1], w)+1){
  75.         forn(j, w+1){
  76.             if(dp[n-1][i][j] > best){
  77.                 best = dp[n-1][i][j];
  78.                 cant = j;
  79.                 comproUlt = i;
  80.             }
  81.         }
  82.     }
  83.     cout << best << " " << cant << "\n";
  84.     vector<int> ret;
  85.     ret.push_back(comproUlt);
  86.     int st = n-1;
  87.     while(st != -1){
  88.         auto s = vengo[st][comproUlt][cant];
  89.         if(s.buy == -1) break;
  90.         ret.push_back(s.buy);
  91.         st = st-1;
  92.         comproUlt = s.buy;
  93.         cant = s.tot;
  94.     }
  95.     assert(ret.size() > 0);
  96.     for(int i=int(ret.size())-1;i>=0;i--){
  97.         cout << ret[i] << " ";
  98.     }
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement