Published 2022. 2. 23. 16:20

문제 링크

http://icpc.me/2662

 

2662번: 기업투자

어떤 투자가가 여러 기업들에게 돈을 투자해서 최대의 이익을 얻고자 한다. 단, 투자는 만원 단위로 할 수 있으며 각 기업은 많이 투자할수록 많은 이익을 투자가에게 돌려준다. 돈을 투자하지

www.acmicpc.net

풀이

배낭 문제라고도 불리는 웰노운인 knapsack문제다. 

dp를 이용하여 풀 수 있다.

dp[i][j] = max(dp[i - 1][j - k] + arr[k][i]) (0 <= j <= n, 0 <= k <= j)

=> i번째 기업까지만 골랐을때 i번째 기업에 k만큼 투자했고, 총 j만큼 투자했다.

위의 점화식으로 풀 수 있다.

코드

#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;

int arr[302][22], dp[22][302];
pii par[22][302];

int main() {
    int n, m; scanf("%d %d", &n, &m);

    for (int i = 1; i <= n; i++) {
        int k; scanf("%d", &k);
        for (int j = 1; j <= m; j++) {
            scanf("%d", &arr[k][j]);
        }
    }

    for (int i = 1; i <= m; i++) {
        for (int j = 0; j <= n; j++) {
            for (int k = 0; k <= j; k++) {
                if (dp[i][j] < dp[i - 1][j - k] + arr[k][i]) {
                    dp[i][j] = dp[i - 1][j - k] + arr[k][i];
                    par[i][j] = {i - 1, j - k};
                }
            }
        }
    }

    vector<int> ans;
    int i = m, j = n;
    while (i > 0 && j > 0) {
        auto [ni, nj] = par[i][j];
        ans.push_back(j - nj);
        i = ni;
        j = nj;
    }
    printf("%d\n", dp[m][n]);
    for (int i = m - 1; i >= 0; i--) printf("%d ", ans[i]);
}

'Algorithm > BOJ' 카테고리의 다른 글

[백준] 1368 물대기  (0) 2022.03.16
[백준] 1126 같은 탑  (0) 2022.02.26
[백준] 2481 해밍 경로  (0) 2022.02.17
[백준] 1533 길의 개수  (0) 2022.02.03
[백준] 12850 본대 산책 2  (0) 2022.01.27
복사했습니다!