πŸ™‡β€β™€οΈ[Gold V] 동전 1 - 2293

문제 링크

μ„±λŠ₯ μš”μ•½

λ©”λͺ¨λ¦¬: 2100 KB, μ‹œκ°„: 0 ms

λΆ„λ₯˜

λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°

제좜 일자

2024λ…„ 1μ›” 12일 13:19:41

문제 μ„€λͺ…

n가지 μ’…λ₯˜μ˜ 동전이 μžˆλ‹€. 각각의 동전이 λ‚˜νƒ€λ‚΄λŠ” κ°€μΉ˜λŠ” λ‹€λ₯΄λ‹€. 이 동전을 μ λ‹Ήνžˆ μ‚¬μš©ν•΄μ„œ, κ·Έ κ°€μΉ˜μ˜ 합이 k원이 λ˜λ„λ‘ ν•˜κ³  μ‹Άλ‹€. κ·Έ 경우의 수λ₯Ό κ΅¬ν•˜μ‹œμ˜€. 각각의 동전은 λͺ‡ κ°œλΌλ„ μ‚¬μš©ν•  수 μžˆλ‹€.

μ‚¬μš©ν•œ λ™μ „μ˜ ꡬ성이 같은데, μˆœμ„œλ§Œ λ‹€λ₯Έ 것은 같은 κ²½μš°μ΄λ‹€.

μž…λ ₯

첫째 쀄에 n, kκ°€ 주어진닀. (1 ≀ n ≀ 100, 1 ≀ k ≀ 10,000) λ‹€μŒ n개의 μ€„μ—λŠ” 각각의 λ™μ „μ˜ κ°€μΉ˜κ°€ 주어진닀. λ™μ „μ˜ κ°€μΉ˜λŠ” 100,000보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

좜λ ₯

첫째 쀄에 경우의 수λ₯Ό 좜λ ₯ν•œλ‹€. 경우의 μˆ˜λŠ” 231보닀 μž‘λ‹€.

πŸš€ν’€μ΄

dpλ¬Έμ œμ˜€λ‹€.

냅색 μ•Œκ³ λ¦¬μ¦˜μ„ μ‘μš©ν•œ 문제둜 점화식이 μ€‘μš”ν–ˆλ‹€.

점화식은 λ‹€μŒκ³Ό κ°™λ‹€.
dp[j] += dp[j - arr[i]];
μ ν™”μ‹μ˜ μ˜λ―ΈλŠ” j원을 λ§Œλ“€ 수 μžˆλŠ” 경우의 수 이닀.

예λ₯Ό λ“€μ–΄ μ•„λž˜μ™€ 같은 예제라면

3 10
1
2
5

κ²°κ³ΌλŠ” 10μ΄μ—¬μ•Όν•œλ‹€.

int n, k;
int dp[20000];
vector<int> arr;
void solve()
{
	cin >> n >> k;
	arr = vector<int>(n);
	for (int i = 0; i < n; ++i)
	{
		cin >> arr[i];
	}

	sort(arr.begin(), arr.end());

	dp[0] = 1;

	for (int i = 0; i < n; ++i)
	{
		for (int j = arr[i]; j <= k; ++j)
		{
			dp[j] += dp[j - arr[i]]; // 점화식
			cout << "j : " << j << " dp[" << j << "] : " << dp[j] << endl; // 쀑간 κ²°κ³Όλ₯Ό 보기 μœ„ν•œ μ½”λ“œ
		}
	}

	cout << dp[k];
}

μœ„μ™€ 같이 μž‘μ„±ν•˜κ³  돌리면 μ•„λž˜μ™€ 같은 κ²°κ³Όκ°€ λ‚˜μ˜¨λ‹€.

image

냅색 μ•Œκ³ λ¦¬μ¦˜μ΄ μ œλŒ€λ‘œ 이해됐닀면 μ‰½κ²Œ μ•Œκ±°κ°™μ€λ° λ‚œ 쑰금 μ–΄λ €μ› λ‹€..

πŸš€μ „μ²΄ μ½”λ“œ

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

int n, k;
int dp[20000];
vector<int> arr;
void solve()
{
	cin >> n >> k;
	arr = vector<int>(n);
	for (int i = 0; i < n; ++i)
	{
		cin >> arr[i];
	}

	sort(arr.begin(), arr.end());

	dp[0] = 1;

	for (int i = 0; i < n; ++i)
	{
		for (int j = arr[i]; j <= k; ++j)
		{
			dp[j] += dp[j - arr[i]];
			cout << "j : " << j << " dp[" << j << "] : " << dp[j] << endl;
		}
	}

	cout << dp[k];
}

int main() 
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	freopen("input.txt", "rt", stdin);

	solve();

	return 0;
}

νƒœκ·Έ:

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ: