-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path1767.cpp
69 lines (53 loc) · 1.53 KB
/
1767.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
#include <iostream>
using namespace std;
struct Pacote {
int qtBrinquedos;
int qtPacotes;
int peso;
};
Pacote knapsack(Pacote *S, int n, int W) {
Pacote m[W+1][n+1];
int res[3];
for(int j = 0; j <= n; j++) {
m[0][j].qtBrinquedos = 0;
m[0][j].qtPacotes = 0;
}
for(int w = 0; w <= W; w++) {
m[w][0].qtBrinquedos = 0;
m[w][0].qtPacotes = 0;
}
for(int j = 1; j <= n; j++) {
for(int w = 1; w <= W; w++) {
if (S[j-1].peso > w)
m[w][j] = m[w][j-1];
else {
if (m[w-S[j-1].peso][j-1].qtBrinquedos + S[j-1].qtBrinquedos > m[w][j-1].qtBrinquedos) {
m[w][j].qtBrinquedos = m[w-S[j-1].peso][j-1].qtBrinquedos + S[j-1].qtBrinquedos;
m[w][j].qtPacotes = m[w-S[j-1].peso][j-1].qtPacotes + 1;
} else {
m[w][j].qtBrinquedos = m[w][j-1].qtBrinquedos;
m[w][j].qtPacotes = m[w][j-1].qtPacotes;
}
}
if (m[w][j].qtBrinquedos > m[w-1][j].qtBrinquedos && j == n)
m[W][n].peso = w;
}
}
return m[W][n];
}
int main() {
int n, pac;
cin >> n;
while(n--) {
cin >> pac;
Pacote pacotes[pac];
for(int i=0; i<pac; i++)
cin >> pacotes[i].qtBrinquedos >> pacotes[i].peso;
Pacote res = knapsack(pacotes, pac, 50);
cout << res.qtBrinquedos << " brinquedos" << endl;
cout << "Peso: " << res.peso << " kg" << endl;
cout << "sobra(m) " << pac - res.qtPacotes << " pacote(s)" << endl;
cout << endl;
}
return 0;
}