damihenrique

Untitled

Apr 25th, 2017
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.32 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define INF 0x3F3F3F3F
  4. #define DINF 1e+12
  5. #define rep(i, a, b) for (int i = int(a); i < int(b); i++)
  6. #define pb push_back
  7. #define pi 3.1415926535897932384626433832795028841971
  8. #define debug(x) if(1) cout << #x << " = " << x << endl;
  9. #define debug2(x,y) cout << #x << " = " << x << " --- " << #y << " " << y << "\n";
  10. #define all(S) (S).begin(), (S).end()
  11. #define MAXV 1005
  12. #define F first
  13. #define S second
  14. #define EPS 1e-9
  15. #define mp make_pair
  16.  
  17. // freopen("in.txt", "r", stdin);
  18. // freopen("out.txt", "w", stdout);
  19.  
  20. using namespace std;
  21.  
  22. typedef long long ll;
  23. typedef pair < int, int >  ii;
  24.  
  25. const int MAXN = 105;
  26. const int MAXC = 1005;
  27.  
  28. int N; // quantidade de itens
  29. int C; // capacidade total da mochila
  30.  
  31. int v[MAXN]; // valores dos itens
  32. int w[MAXN]; // peso dos itens
  33.  
  34. // tabela onde salvo tudo que já calculei
  35. // para não calcular novamente
  36. int pd[MAXN][MAXC];
  37.  
  38.                    
  39. // i -> qual item estou analisando no momento
  40. // cap -> qual a capacidade restante atual da mochila                
  41. int solve(int i, int cap){
  42.    
  43.     // Caso Base, se cheguei já passei por todos os itens, posso retornar 0
  44.     // já que max(qualquer coisa, 0), dará qualquer coisa (obs: nao temos valores negativos nesse problema)
  45.     if(i == N)
  46.         return 0;
  47.    
  48.     // Verifica tabela para ver se já foi calculado
  49.     // se sim, simplesmente retorna
  50.     if(pd[i][cap] != -1)
  51.         return pd[i][cap];
  52.    
  53.     // váriaveis que irão receber os resultados das possíveis transições
  54.     int pega = 0, naoPega = 0;
  55.    
  56.     // 1ª transição:
  57.     // se o item atual (i) couber na minha mochila eu pego ele e vou para o próximo
  58.     // subtraio seu peso (w[i]) da capacidade da mochila e somo o valor que ele me da (v[i])
  59.     if(cap-w[i] >= 0)
  60.         pega = solve(i+1, cap-w[i]) + v[i];
  61.    
  62.     // 2º transição:
  63.     // simplesmente não pego o item atual e vou para o próximo
  64.     naoPega = solve(i+1, cap);
  65.    
  66.     // como quero maximizar o valor, pego o máximo das minhas transições
  67.     int melhor = max(pega, naoPega);
  68.    
  69.     // salvo na tabela e retorno
  70.     pd[i][cap] = melhor;
  71.     return pd[i][cap];
  72. }
  73.  
  74. int main(){
  75.  
  76.     // inicializo a tabela com -1
  77.     memset(pd, -1, sizeof(pd));
  78.    
  79.     // faço a entrada de N, C, v[] e w[]
  80.     // .........
  81.    
  82.     // chamo a função, começando do item 0 com capacidade total (C)
  83.     int ans = solve(0, C);
  84.    
  85.  
  86.     return 0;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment