기술 블로그

12865번 평범한 배낭 본문

알고리즘 문제/BOJ

12865번 평범한 배낭

parkit 2019. 10. 21. 00:48
728x90
반응형

https://www.acmicpc.net/problem/12865





knapsack 알고리즘이다.






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
#include <bits/stdc++.h>
 
using namespace std;
 
int N, Capacity, dp[101][100001]; // dp[인덱스][용량]
vector<pair<intint> > items;
 
int knapsack(int pos, int cap)
{
    if (pos == N) return 0;
 
    // cache
    int & ret = dp[pos][cap];
    if (ret != -1return ret;
 
    // 현재 pos 번째의 가방 무게(first)가 남은 용량(cap)보다 적다면
    if (items[pos].first <= cap) ret = knapsack(pos + 1, cap - items[pos].first) + items[pos].second;
    
    // 현재 가방(pos)을 선택하지 않고, 다음 가방(pos + 1)을 선택할 수 있다.
    ret = max(ret, knapsack(pos + 1, cap));
 
    return ret;
}
 
int main(void)
{
    //freopen("C:\\Users\\park7\\Desktop\\sample_input.txt", "r", stdin);
    memset(dp, -1sizeof(dp));
    int W, V;
    scanf("%d %d"&N, &Capacity);
    for (int i = 0; i < N; i++)
    {
        scanf("%d %d"&W, &V);
        items.push_back({ W, V });
    }
 
    printf("%d\n", knapsack(0, Capacity));
 
    return 0;
}
cs












728x90
반응형

'알고리즘 문제 > BOJ' 카테고리의 다른 글

17779번 게리맨더링 2  (0) 2019.10.23
5397번 키로거  (0) 2019.10.21
17609번 회문  (0) 2019.10.13
3190번 뱀  (0) 2019.10.10
2529번 부등호  (0) 2019.10.01