백준/동적계획법
[백준] C++ 11052(카드 구매하기)
2zreal
2024. 7. 7. 21:14
#include <iostream>
using namespace std;
int arr[1001];
int DP[1001];
int main(void)
{
int a=0;
cin>>a;
for(int i=1; i<=a; i++)
{
cin>>arr[i];
}
for(int i=1; i<=a; i++)
{
for(int j=1; j<=a; j++)
{
if(i-j>=0)
{
if(DP[i]<arr[j]+DP[i-j])
{
DP[i]=arr[j]+DP[i-j];
}
}
else
{
break;
}
}
}
cout<<DP[a];
return 0;
}
P1 = 5, P2 = 2, P3 = 8, P4 = 10
P1 카드팩에 1장이 들어있고 5원
P2 카드팩에 2장이 들어있고 2원
P3 카드팩에 3장이 들어있고 8원
P4 카드팩에 4장이 들어있고 10원
카드 N개를 갖기 위해 지불해야 하는 최댓값을 구하는 문제이다.
흠 어떻게 접근해야 좋을까??
나는 카드 1~N장에 필요한 최댓값을 구하는 방법으로 해결하였다.
카드 1장에 대한 경우의 수
P1 카드팩을 1개를 사는 경우(5원)
카드 2장에 대한 경우의 수
P1 카드팩을 2개를 사는 경우(10원)
P2 카드팩을 1개 사는 경우(2원)
카드 3장에 대한 경우의 수
P1 카드팩을 3개 사는 경우(15원)
P1 카드팩을 1개 사고 P2 카드팩을 1개 사는 경우(7원)
P3 카드팩을 1개 사는 경우(8원)
카드 4장에 대한 경우의 수
P1 카드팩을 4장 사는 경우(20원)
P1 카드팩을 1장 사고 P3 카드팩을 1 장사는 경우(13원)
P2 카드팩을 2장 사는 경우(4원)
P4 카드팩을 1개를 사는 경우(10원)
그림이 조금 조잡하긴 한데 이런 흐름으로 진행된다.
카드 1장의 최댓값을 구하고
이걸 이용해서 카드 2장의 최댓값을 구하고
또 이걸 이용해서 카드 3장의 최댓값을 구한다.
각 개수의 최댓값을 구한 뒤 그 값과 어떠한 카드팩을 추가했을 때 값이 N이 되는 값 중에서 가장 큰 값을 저장한다.
if(DP[i]<arr[j]+DP[i-j])
{
DP[i]=arr[j]+DP[i-j];
}