-
반응형
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; }
반응형'문제풀이 > 백준oj' 카테고리의 다른 글
[백준OJ] 1789번 수들의 합 (0) 2021.07.02 [백준OJ] 11057번 오르막 수 (0) 2021.07.02 [백준OJ] 17140번 이차원 배열과 연산 (0) 2021.06.28 [백준OJ] 11034번 캥거루 세마리2 (0) 2021.06.20 [백준OJ] 12851번 숨바꼭질 2 (0) 2021.06.12 댓글