0. 문제 |
1. 아이디어 |
1) 해당 문제에서 dp는 N개를 사기 위한 최대 금액값!
2) 처음 생각했을 땐 dp[N]은 dp[N-1] + P1이라고 생각했지만 테스트케이스에서 볼 수 있듯이 그러지 않은 경우가 있었다. 예를 들어 카드 4개를 사려고 구매하려고 할 때 2개 포함된 카드팩 2개를 사는게 더 금액의 값이 큰 경우가 있다!
3) 그래서 해당 경우까지 모두 고려해주기 위해서 반복문을 사용했다. (물론 시간을 고려했다)
(이때, 순열이 아니라 조합으로 봐야한다!)
2. 소스코드 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include <iostream>
int main()
{
int N, price[1001], dp[1001];
std::cin >> N;
for (int i = 1; i <= N; i++)
std::cin >> price[i];
dp[1] = price[1];
for (int i = 2; i <= N; i++)
{
int max = price[i];
for (int j = i - 1; j >= i / 2; j--)
{
int temp = dp[j] + dp[i - j];
if (temp > max) max = temp;
}
dp[i] = max;
}
std::cout << dp[N];
}
|
cs |
3. 결과 |
4. 피드백 |
-
ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ
'알고리즘 > BOJ' 카테고리의 다른 글
[C++] 백준 11650번 - 좌표 정렬하기 (0) | 2020.03.28 |
---|---|
[C++] 백준 2751번 - 수 정렬하기 2 (0) | 2020.03.28 |
[C++] 백준 2011번 - 암호코드 (0) | 2020.03.26 |
[C++] 백준 2225번 - 합분해 (1) | 2020.03.25 |
[C++] 백준 9461번 - 파도반 수열 (0) | 2020.03.25 |