Step-by-Step

[C++] 백준2293 - 동전 1 본문

언어/C++

[C++] 백준2293 - 동전 1

희주(KHJ) 2022. 10. 26. 18:18

https://www.acmicpc.net/problem/2293

 

2293번: 동전 1

첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다.

www.acmicpc.net

BFS + DFS만 주구장창 하던 나 반성해..

DP 연습 좀 해야겠다고 느낀 문제 😂

그냥 피보나치 수열처럼 단순히 누적으로 넣는 것이 아니라 좀 문제를 제대로 이해해야 전략을 세울 수 있다.

 

문제에서 주어진 예제

동전 3개로 10을 만들어야 한다.

일단 주의할 점은 0원을 만들기 위해서 모두 선택하지 않는 경우의 수 1개가 있다.

 

설명은 아래 그림 참조 (잘 그린지는 모르겠지만.)

 

 

코드

#include <iostream>
#include <vector>

using namespace std;

int main() {

	int n, k;
	cin >> n >> k;

	vector<int> arr(n);
	vector<int> dp(k + 1);

	for (int i = 0; i < n; i++) {
		cin >> arr[i];
	}

	// 0원 -> 아무 동전도 선택하는 경우 1가지
	dp[0] = 1;

	for (int i = 0; i < n; i++) {
		// 각 동전마다 진행
		// 동전의 값 미만은 경우의 수 0

		for (int j = arr[i]; j <= k; j++) {
			// j=7이고 arr[i] = 2 이면, 2 1개고정에 나머지 5를 만들 수 있는 경우의 수를 더해줌
			// 그게 2 x 3개 + 1 x 1개 이던, 2 x 1개 + 5 x 1개 이든, 앞에 모든 경우의 수가 나타남
			dp[j] += dp[j - arr[i]];
		}
	}
	cout << dp[k];
}

 

 

'언어 > C++' 카테고리의 다른 글

[C++] 백준1915 - 가장 큰 정사각형  (0) 2022.12.15
[C++] Struct와 Class  (0) 2022.11.29
[C++] Struct, priority_queue 간단한 사용  (0) 2022.11.15
[C++] Queue / Stack / Pair  (0) 2022.10.28
[C++] 기본 입출력  (0) 2022.10.26
Comments