문제

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

걸린 시간

01 : 59 : 30 실패

풀이

C++

#include <bits/stdc++.h>
#define INF 987654321
using namespace std;

int n, k;
int volume[101], need[101];
int cache[100001][101];

int pack(int capacity, int item){
    // 메모이제이션
    int& ret = cache[capacity][item];
    if(ret != -1)
        return ret;
    // 재귀 호출
    int ans = 0;
    for(int i = item+1; i <= n; i++)
        if(capacity+volume[i] <= k)
            ans = max(ans, pack(capacity+volume[i], i)+need[i]);
    return ret = ans;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> k;
    for(int i = 1; i <= n; i++)
        cin >> volume[i] >> need[i];
    memset(cache, -1, sizeof(cache));
    cout << pack(0, 0) << "\n";
    return 0;
}

이 문제는 배낭 문제(knapsack problem)라고 부르는 조합 최적화의 유명한 문제 중 하나이다.

배낭 문제에는 여러 가지 다른 형태가 있는데 그중 대표적인 각 물건을 최대 하나만 고를 수 있는 0/1 배낭 문제로 완전 탐색에 메모이제이션을 적용하여 쉽게 해결할 수 있다.

하지만 중복이 발생하는 부분을 정확히 찾아내지 못하여 풀지 못했다...

'Baekjoon' 카테고리의 다른 글

Baekjoon 11718번 그대로 출력하기  (0) 2020.09.03
Baekjoon 19575번 Polynomial  (0) 2020.09.02
Baekjoon 1043번 거짓말  (0) 2020.08.31
Baekjoon 15652번 N과 M (4)  (0) 2020.08.30
Baekjoon 15650번 N과 M (2)  (0) 2020.08.30

댓글