반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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
Archives
Today
Total
관리 메뉴

코딩하기 좋은날

백준 12920 평범한 배낭2 본문

백준(Baekjoon) 문제

백준 12920 평범한 배낭2

huiung 2019. 11. 8. 12:53
반응형

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

문제와 채점은 위 사이트에서 확인 하실 수 있습니다

 

이문제는 평범한 배낭1의 업그레이드(?) 문제입니다. 아마 이문제 푸시는 분들은 평범한 배낭1문제를 푸셨을 거라고 생각하는데요. 두문제의 유일한 차이는 물건의 개수입니다. 이문제 같은 경우 물건의 개수가 여러개 일 수 있습니다. 따라서 각각 경우를 모두 고려해주어야 하는데 어떻게 해야할지 생각이 잘 안나서 다른 분들의 풀이를 참고 하였습니다.

 

가장 중요한 아이디어는 사용할 수 있는 물건의 개수를 2의 제곱수의 합으로 분리 시키는 것입니다.

예를 들어 A라는 물건이 7개 있다면 각각 1개 / 2개 /4개의 물건으로 분리시키고 그에 맞는 만족도를 저장합니다. 이런식으로 분리시키면 각각 1,2,4의 조합으로 1개부터 7개까지 선택하는 모든 조합을 확인할 수 있게 됩니다. 따라서 모든 물건에 대해서 이 과정을 진행해주면 결국 기존의 냅색문제가 됩니다. 따라서 이후에는 평범한 배낭1 에서 풀었던 방식으로 문제를 해결하면 됩니다.

 

다음은 코드입니다.

 

#include <iostream>
#include <cstring>
#include <vector>

#define MAX 10001
using namespace std;

int V[MAX];
int C[MAX];
int K[MAX];
int dp[MAX];
int N,M;
vector<pair<int, int> > thing;

int main(void) {
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    cin >> N >> M;

    for(int i = 0; i < N; i++) {
        cin >> V[i] >> C[i] >> K[i];
    }


    for(int j = 0; j < N; j++) {
        for(int i = K[j]; i > 0; i>>=1) {
            int num = i-(i>>1);
            thing.push_back({V[j]*num, C[j]*num});
        }
    }

    for(int i = 0; i < thing.size(); i++) {
        int v = thing[i].first;
        int c = thing[i].second;
        for(int j = M; j >= v; j--) {
            dp[j] = max(dp[j], dp[j-v]+c);
        }
    }
    cout<<dp[M];

    return 0;
}
반응형

'백준(Baekjoon) 문제' 카테고리의 다른 글

백준 파이프 옮기기 2  (0) 2019.11.10
백준 17135 캐슬 디펜스  (0) 2019.11.10
백준 10942 팰린드롬?  (0) 2019.11.07
백준 2248 이진수 찾기  (0) 2019.11.03
백준 1256 사전  (0) 2019.11.01