문제
2293번: 동전 1
첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다.
www.acmicpc.net
소스코드
#include <bits/stdc++.h>
using namespace std;
int dp[10001];
int arr[101];
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int n, k;
cin >> n >> k;
for (int i = 0; i < n; i++) cin >> arr[i];
dp[0]=1;
for (int i = 0; i < n; i++) {
for (int j = 1; j <= k; j++) {
if (arr[i] <= j) {
dp[j] = dp[j] + dp[j - arr[i]];
}
}
}
cout << dp[k];
}
풀이
1. 0을 만드는 경우 -> 처음에 그냥 아무것도 선택하지 않은 경우 즉 dp[0]=1 초기값을 설정해줌.
2. dp[j] -> 코인의 종류는 j 코인이 최소 포함되어 만들 수 있는 경우의 수
1원짜리 코인으로 k번째 즉 10원까지 만들 수 있는 경우의 수는 1원을 포함해서 10원을 만들어야하닌간 한가지의 경우의 수밖에 없다
그다음 2원짜리 코인으로 2원을 최소 한개이상 포함해서 10원까지 만들 수 있는 경우의 수는 0 1 은 2원이 포함되지 않으니 0으로 설정되어야 한다. 그 이후 2원부터는 저위의 그림처럼 가져온다는 것을 알 수 있다.
즉 2차원 배열로 만들 수 있는데 2차원 배열로 만들게되면 메모리 초과가 나게된다.
그래서 1차원 배열로 점화식을 세울 수 있는데
dp[j] = dp[j] + dp[j - arr[i]];
이 문제와 비슷한게 평범한 배낭 문제가 있다.
12865번: 평범한 배낭
첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000)
www.acmicpc.net
'Algorithm > dynamic programming' 카테고리의 다른 글
[백준] 알고리즘 1965번 - 상자넣기 문제 (0) | 2021.04.03 |
---|---|
[백준] 알고리즘 12865번 - 평범한 배낭 문제 (0) | 2021.03.31 |
[백준] 알고리즘 17212번 - 달나라 토끼를 위한 구매대금 지불 도우미 문제 (0) | 2021.03.29 |
[백준] 알고리즘 17175번 - 피보나치는 지겨웡~ 문제 (0) | 2021.03.28 |
[백준] 알고리즘 14495번 - 피보나치 비스무리한 수열 문제 (0) | 2021.03.28 |