PS 연습
[DP] 백준 문제 풀이 - 11052 카드 구매하기
생선묵김치찌개
2022. 6. 25. 22:51
👩🏻💻 문제링크
https://www.acmicpc.net/problem/11052
11052번: 카드 구매하기
첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000)
www.acmicpc.net
✍️ 아이디어
1. 문제 이해
- 1장~N장이 들어있는 카드팩이 있는데 N장의 카드를 사기 위해 가장 많은 돈을 지불하는 방법을 구함
2. 처음 내 생각은 1장부터 n-1장까지 가장 많은 돈을 지불하는 경우를 전부 구하면 n장은 저 사이에서 2개를 더한 값과 같을거라 생각함
✍️소스코드
- 나의 코드 : 최댓값끼리 더하면 최댓값 나오지 않을까? 라는 반례가 안나와서 그냥 밀어붙임
#include <iostream>
using namespace std;
long long result[1001]; //카드 N개를 갖기위해 지불하는 최대 금액
int main()
{
int card[1001];
card[0]=0;
int n; cin>>n;
for(int i=1; i<=n; i++)
{
cin>>card[i];
}
for(int i=1; i<=n; i++)
{
result[i]=card[i]; //처음으로 카드팩 하나를 사는것을 가정
for(int j=0; j<=i; j++)
{
if(result[i]<result[i-j]+result[j]) // 최댓값끼리 더하면 최댓값 나오지 않을까?
{
result[i]=result[i-j]+result[j];
}
}
}
cout<<result[n]<<'\n';
}
- 다른 사람의 코드 : 이것이 더 이해가 잘됨
여기서는 i - j 개의 카드를 살때의 최대 금액과 j개가 들어있는 카드팩을 살때를 더해서 최댓값을 구하고 있다
ex) 카드 4개 살때의 최댓값
1. 카드 3개를 살 때의 최댓값 + 1번째 카드
2. 카드 2개를 살 때의 최댓값 + 2번째 카드
3. 카드 1개를 살 때의 최댓값 + 3번째 카드
4. 카드 0개를 살 때의 최댓값 + 4번째 카드
체감난이도 | 걸린시간 | 참고 | 사용 문법 |
중 | 30min | x | 2차원 DP |