답은 알고리즘 뿐이야!

[Algospot 저장용] PACKING 본문

알고리즘/기타

[Algospot 저장용] PACKING

skyde47 2019. 9. 5. 11:33

문제 출처 : https://algospot.com/judge/problem/read/PACKING

 

 

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
#include<stdio.h>
 
struct product {
    char name[21];
    int w;
    int imp;
};
 
struct queue {
    char* data[101];
    int front, rear;
    void init() { front = rear = 0; }
    void push(char inp[]) { data[front++= inp; }
    char* pop() { return data[rear++]; }
    bool empty() { return front == rear; }
    int size() { return front - rear; }
}q;
 
product p[100];
int t, n, w, arr[1001][100];
 
int solve(int wei, int item)
{
    if (item == n || wei<0)return 0;
    int &ret = arr[wei][item];
    if (ret != 0)return ret;
 
    ret = solve(wei, item + 1);
 
    if (wei >= p[item].w)
    {
        int tmp = solve(wei - p[item].w, item + 1+ p[item].imp;
        ret = tmp > ret ? tmp : ret;
    }
    return ret;
}
 
void result(int wei, int item)
{
    if (item == n)return;
 
    if (arr[wei][item + 1== arr[wei][item])result(wei, item + 1);
    else
    {
        q.push(p[item].name);
        result(wei - p[item].w, item + 1);
    }
}
 
int main()
{
    scanf("%d"&t);
 
    while (t--)
    {
        q.init();
        scanf("%d %d\n"&n, &w);
        for (int i = 0; i <= w; i++)for (int j = 0; j < n; j++)arr[i][j] = 0;
        for (int i = 0; i < n; i++)scanf("%s %d %d\n", p[i].name, &p[i].w, &p[i].imp);
        int ret = solve(w, 0);
        result(w, 0);
        printf("%d %d\n", ret, q.size());
        while (!q.empty())printf("%s\n", q.pop());
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
Comments