문제 : 백준 11052 카드 구매하기♣️
난이도 : 실버 1
1️⃣ 카드는 카드팩의 형태로만 구매할 수 있다.
2️⃣ 카드팩의 종류는 카드 1개가 포함된 카드팩, 카드 2개가 포함된 카드팩, ... 카드 N개가 포함된 카드팩과 같이 총 N가지가 존재한다.
3️⃣ 민규는 돈을 최대한 많이 지불해서 카드 N개 구매하려고 한다.
4️⃣ 카드가 i개 포함된 카드팩의 가격은 Pi원이다.
5️⃣ N개보다 많은 개수의 카드를 산 다음, 나머지 카드를 버려서 N개를 만드는 것은 불가능하다.
6️⃣ 구매한 카드팩에 포함되어 있는 카드 개수의 합은 N과 같아야 한다.
ex) 카드팩이 총 4가지 종류가 있고, P1 = 1, P2 = 5, P3 = 6, P4 = 7인 경우
DP에서는 점화식을 찾는 것이 가장 중요하다!!
따라서, 1개의 카드를 구매할 때부터 N개의 카드를 구매할 때의 최대 비용을 나열해보면서 규칙을 찾아본다 🔥
int cards[N+1];
int dp[N+1];
for(int i=1; i<=N; i++){
cin>>cards[i];
dp[i] = 0;
}
dp[0] = 0;
dp[1] = cards[1];
for(int i=2; i<=N; i++){
for(int j=1; j<=i; j++){
dp[i] = max(dp[i], cards[j]+dp[i-j]);
}
}
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
std::ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int N = 0;
cin>>N;
int cards[N+1];
int dp[N+1];
for(int i=1; i<=N; i++){
cin>>cards[i];
dp[i] = 0;
}
dp[0] = 0;
dp[1] = cards[1];
for(int i=2; i<=N; i++){
for(int j=1; j<=i; j++){
dp[i] = max(dp[i], cards[j]+dp[i-j]);
}
}
cout<<dp[N]<<"\n";
}