문제풀이/백준oj
[백준OJ] 11052번 카드 구매하기
Hyeon-Uk
2021. 6. 30. 01:00
반응형
https://www.acmicpc.net/problem/11052
11052번: 카드 구매하기
첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000)
www.acmicpc.net
-풀이-
비용을 저장하는 배열 cost와, dp배열을 선언하여 풀이를 했다.
dp[i] = K 는 i장의 카드를 사는데 드는 최댓값 K원이라는 뜻이다.
i장의 카드뭉치의 비용이 c라고 하자.
i장의 카드뭉치를 들고 j장을 구매했을때, 최댓값을 구하기 위해선, 먼저 i장의 카드뭉치를 사용하지 않고 구매한 비용(dp[j]의 값) 과, i장의 카드뭉치를 사용하여 j장을 구매했을때의 비용(dp[j-i]의 값+ i장의 카드뭉치의 비용 c )의 값을 비교하여, 둘중 더 큰값을 dp[j]에 갱신시켜주면 된다.
이를 전체로 적용시켜 문제를 해결했다.
-시간복잡도-
O(N2)
-코드-
#include <iostream>
#include<algorithm>
using namespace std;
int cost[1001] = { 0 };
int n;
long long dp[1001] = { 0 };
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> cost[i];
}
for (int i = 1; i <=n; i++) {
int c = cost[i];
for (int j = i; j <= n; j ++) {
if (dp[j] < dp[j - i] + c) {
dp[j] = dp[j - i] + c;
}
}
}
cout << dp[n];
return 0;
}
반응형