문제
기업투자
배낭 문제인데 좀 특별한 배낭 문제입니다.
풀이
기업 1부터 기업 $x$까지 투자했을때 최대 이익을 기업 1부터 기업 $x+1$까지 투자했을때 최대 이익을 구하는데 쓸 수 있는 DP, 그 중에서도 배낭 문제입니다.
구해야 할 답
구해야 할 답은 총 2가지입니다.
- 최대 이익
- 최대 이익을 위해 각 회사에 투자해야 할 금액
1. 최대 이익
배낭의 크기 제한(투자 금액), 고를 수 있는 물건(기업), 골랐을 때의 가치(이익)이 주어져 있습니다.
먼저, 수열 몇개를 정의해 줍시다.
$profit_{ij}$는 i번째 기업에 j만큼 투자했을 때 얻는 이익입니다.
$dp_{ij}$는 i번째 기업까지 총 j만큼 투자했을 때 얻는 최대 이익입니다.
그러면 점화식을 세워 풀 수 있습니다.
$dp_{ij} = max(dp_{ij},\ dp_{i-1\ j-k} + profit_{ik})\ (0 \leq k \leq j)$
말로 풀어서 쓰자면, 투자했던 금액 중 k만큼을 철회하고, 그 금액만큼 i번째 기업에 투자하는게 더 이득이라면 그렇게 하겠다는 것입니다.
2. 각 회사별 투자 금액
투자 금액도 DP를 이용해서 구합니다.
배열 하나를 정의해 줍시다.
$answer_{ij}$는 i번째 기업까지 총 j만큼 투자했을 때 최대 이익을 얻는 방법입니다.
$answer_{24} = \{\ 0\ 4\ \}$와 같은식으로 배열의 값을 갖습니다. 이 수들 중 x번째 수는 x번째 기업에 투자할 금액을 나타냅니다.
그렇다면 $answer_{ij}$도 DP를 이용해 구할 수 있습니다.
만약 $dp_{ij}$의 값이 갱신된다면,
$answer_{ij} = answer_{i-1\ j-k} + \{\ k\ \}$ 입니다.
코드로 나타내면 아래와 같이 나타낼 수 있겠습니다.
1 |
|
코드
i, j는 짧아서 좋지만 너무 헷갈린다는 단점이 있어 대신 corp, usedMoney라는 변수명을 사용했습니다.
1 |
|
여담
골드 II는 아직 쉽지 않네요…