Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define INF 0x3F3F3F3F
- #define DINF 1e+12
- #define rep(i, a, b) for (int i = int(a); i < int(b); i++)
- #define pb push_back
- #define pi 3.1415926535897932384626433832795028841971
- #define debug(x) if(1) cout << #x << " = " << x << endl;
- #define debug2(x,y) cout << #x << " = " << x << " --- " << #y << " " << y << "\n";
- #define all(S) (S).begin(), (S).end()
- #define MAXV 1005
- #define F first
- #define S second
- #define EPS 1e-9
- #define mp make_pair
- // freopen("in.txt", "r", stdin);
- // freopen("out.txt", "w", stdout);
- using namespace std;
- typedef long long ll;
- typedef pair < int, int > ii;
- const int MAXN = 105;
- const int MAXC = 1005;
- int N; // quantidade de itens
- int C; // capacidade total da mochila
- int v[MAXN]; // valores dos itens
- int w[MAXN]; // peso dos itens
- // tabela onde salvo tudo que já calculei
- // para não calcular novamente
- int pd[MAXN][MAXC];
- // i -> qual item estou analisando no momento
- // cap -> qual a capacidade restante atual da mochila
- int solve(int i, int cap){
- // Caso Base, se cheguei já passei por todos os itens, posso retornar 0
- // já que max(qualquer coisa, 0), dará qualquer coisa (obs: nao temos valores negativos nesse problema)
- if(i == N)
- return 0;
- // Verifica tabela para ver se já foi calculado
- // se sim, simplesmente retorna
- if(pd[i][cap] != -1)
- return pd[i][cap];
- // váriaveis que irão receber os resultados das possíveis transições
- int pega = 0, naoPega = 0;
- // 1ª transição:
- // se o item atual (i) couber na minha mochila eu pego ele e vou para o próximo
- // subtraio seu peso (w[i]) da capacidade da mochila e somo o valor que ele me da (v[i])
- if(cap-w[i] >= 0)
- pega = solve(i+1, cap-w[i]) + v[i];
- // 2º transição:
- // simplesmente não pego o item atual e vou para o próximo
- naoPega = solve(i+1, cap);
- // como quero maximizar o valor, pego o máximo das minhas transições
- int melhor = max(pega, naoPega);
- // salvo na tabela e retorno
- pd[i][cap] = melhor;
- return pd[i][cap];
- }
- int main(){
- // inicializo a tabela com -1
- memset(pd, -1, sizeof(pd));
- // faço a entrada de N, C, v[] e w[]
- // .........
- // chamo a função, começando do item 0 com capacidade total (C)
- int ans = solve(0, C);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment