-
Notifications
You must be signed in to change notification settings - Fork 0
/
URI1798_CortandoCanos.cpp
77 lines (63 loc) · 1.19 KB
/
URI1798_CortandoCanos.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/*******************************************
Hugo Danilo Santos Alkimim
********************************************/
#include <bits/stdc++.h>
#define NMAX 2111
using namespace std;
typedef long long int lli;
lli N, T, caso;
lli valor[NMAX], comprimento[NMAX];
lli visitado[NMAX];
lli dp[NMAX];
lli topDown(lli capacidade)
{
if(capacidade == 0)
{
return 0;
}
if(visitado[capacidade] == caso)
{
return dp[capacidade];
}
visitado[capacidade] = caso;
dp[capacidade] = 0;
// Avalia todos os itens que podem ser utilizados
for(lli i = 0; i < N; i++)
{
// Confere se tem capacidade suficiente
if(capacidade >= comprimento[i])
{
dp[capacidade] = max(dp[capacidade], topDown(capacidade - comprimento[i]) + valor[i]);
}
}
return dp[capacidade];
}
void bottomUp()
{
for(lli i = 0; i <= T; i++)
{
dp[i] = 0;
for(lli j = 0; j < N; j++)
{
if(i >= comprimento[j])
{
dp[i] = max(dp[i], dp[i - comprimento[j]] + valor[j]);
}
}
}
}
int main()
{
while(scanf("%lld %lld", &N, &T) != EOF)
{
caso++;
for(lli i = 0; i < N; i++)
{
scanf("%lld %lld", &comprimento[i], &valor[i]);
}
topDown(T);
//bottomUp();
printf("%lld\n", dp[T]);
}
return 0;
}