https://www.acmicpc.net/problem/11052
해당 문제는 다이나믹 프로그래밍 문제로, 1 ~ n 종류의 카드팩까지 있을 때 1 ~ n 개의 카드를 사는 최대 금액을 2차원 dp 배열에 차례대로 갱신하는 Bottom-Up 방식으로 풀었다.
1) n
에 구매하고자 하는 카드의 개수를 입력받아 저장한다.
2) 2차원 배열 dp
를 선언하고, 각 dp를 차례대로 갱신한다.
3) dp[n][n]에 카드 종류가 n가지 있을 때, n개의 카드를 사는 최대 금액이 저장되므로 이를 출력한다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int n;
vector<int> costs;
int dp[1001][1001]; // dp[i][j] : i 번째 카드팩까지 있을 때 j개의 카드를 사는 최대 금액
int solution()
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (i > j)
dp[i][j] = dp[i - 1][j];
else
dp[i][j] = max(dp[i][j - i] + costs[i], dp[i - 1][j]);
}
}
return dp[n][n];
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
cin >> n;
costs.push_back(0);
for (int i = 0; i < n; i++)
{
int num;
cin >> num;
costs.push_back(num);
}
cout << solution();
}