[문제보기]
11052. 카드 구매하기
11052번: 카드 구매하기
첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000)
www.acmicpc.net
[풀이과정]
이 문제는 1장을 구매하는 경우부터 n장을 구매하는 경우까지 차례대로 올라가면서 최대값을 갱신하면서 풀어야되는
문제이다. 필자는 카드팩의 가격의 정보를 저장하는 arr[] 배열과 각 i장을 선택하는 경우에서 최대값을 저장하는 dp[]를
만들었다.
1장을 구매하는 경우
1장 카드팩을 사는 것이 최대값이 된다. (dp[1])
2장을 구매하는 경우
dp[1]에서 1장팩을 선택한 경우 vs dp[0]에서 2장팩을 선택한 경우
둘 중의 최대값이 dp[2]가 된다.
말로 풀자면 1장의 팩을 선택한 경우는 n-1장을 카드팩에서 선택을 해야한다.
2장의 팩을 선택한 경우 n-2장을 카드팩에서 선택을 해야한다.
따라서 점화식은 dp[n] = max(dp[n] , dp[n-i] + arr[i]) 가 된다.
[소스코드]
#include <iostream>
using namespace std;
int main(){
int dp[1001] = {0};
int arr[1001] = {0};
int n;
cin >> n;
for(int i=1; i<=n; i++){
cin >> arr[i];
}
for(int i=1; i<=n; i++){
for(int j=1; j<=i; j++){
dp[i] = max(dp[i], dp[i-j]+arr[j]);
}
}
cout << dp[n];
}
[해결 과정 중 실수한 부분]
'알고리즘 스터디 > Beakjoon' 카테고리의 다른 글
| [백준 1920][C++] 수 찾기 (Silver 4) (0) | 2020.09.12 |
|---|---|
| [백준 1463][C++] 1로 만들기 (Silver 3) (0) | 2020.09.12 |
| [백준 10844][C++] 쉬운 계단 수 (Silver 1) (0) | 2020.09.07 |
| [백준 17142][C++] 연구소3 (Gold4) (0) | 2020.09.06 |
| [백준 19238][C++] 스마트 택시 (Gold 4) (0) | 2020.09.03 |