오답노트

[DP] BOJ 16194 카드 구매하기 2 본문

C,C++/코딩테스트

[DP] BOJ 16194 카드 구매하기 2

권멋져 2022. 5. 10. 14:39
https://www.acmicpc.net/problem/16194
 

16194번: 카드 구매하기 2

첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000)

www.acmicpc.net

- 문제 파악

정수 N과 정수 P1~Pn이 주어진다. P1~ Pn를 적절히 조합하여 N을 만드는 경우의 수중에서 Pi 요소의 합이 최소값을 출력하라.

 

-정답

https://dhjkl123.tistory.com/54

 

[DP] BOJ 11052 카드 구매하기

https://www.acmicpc.net/problem/11052 11052번: 카드 구매하기 첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi..

dhjkl123.tistory.com

와 같은문제인데 최대에서 최소로 문제가 변형 되었다.

1~N개를 만드는 수중에서 요소의 합의 최소값을 배열에 넣어가면서 N까지 증가 시키면 된다.

 

#include "bits/stdc++.h"

using namespace std;

int n;
int D[1002];
int arr[1002];

int main()
{
	cin.tie(NULL);
	ios::sync_with_stdio(0);

	cin >> n;

	cin >> arr[1];
	D[1] = arr[1];

	for (int i = 2; i <= n; i++)
	{
		cin >> arr[i];
		D[i] = 10001;


		for (int j = 0; j <= i / 2; j++)
		{
			int tmp = D[i - j] + D[j];

			if (tmp > arr[i])
			{
				D[i] = min(arr[i], D[i]);
			}
			else
			{
				D[i] = min(tmp, D[i]);
			}
		}

	}

	cout << D[n];

}