https://www.acmicpc.net/problem/2294
지난번에 풀었던 동전 1 과 유사한 문제다.
차이점은 동전 1의 경우 가능한 모든 경우의 수를 구하는 문제였다면
동전 2는 최소의 동전을 사용해서 k의 가치를 만들면 되는 문제이다.
dp[n]을 n이라는 값을 구하기 위해 필요한 최소 동전의 개수라고 가정할 때,
먼저 dp[0]에 1이라는 값을 설정하자.
그리고 순서대로 동전의 가치만큼 값을 구해 나가면 된다.
조건문을 실행할 때 주의를 해야 하는데 처음부터 살펴보면 dp[0]에 값이 1이 있다.
그리고 처음 동전의 가치가 1이라고 한다면
dp[0+1]을 구할 때 dp[0]의 값에 1을 설정했기 때문에 dp[0+1]의 가치를 구하면 된다.
만약에 dp[1]을 구하는 경우가 없었다면 dp[0]의 값에 1을 더해주면 된다.
만약에 dp[1]의 값이 존재한다면 dp[0]에 1을 더한 값과 기존의 dp[1]의 값을 비교해서
최소로 필요한 동전의 개수를 구하면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include <iostream> #include <algorithm> using namespace std; int main(){ int n,k; cin>>n>>k; int arr[101]; int dp[10001]={0}; for(int i=1;i<=n;i++){ scanf("%d",&arr[i]); } //0+arr[1],1+arr[1] //0+arr[2],1+arr[2] dp[0]=1; for(int i=1;i<=n;i++){ for(int j=0;j+arr[i]<=k;j++){ if(dp[j]){ if(dp[j+arr[i]]==0) dp[j+arr[i]]=dp[j]+1; else dp[j+arr[i]]=min(dp[j+arr[i]],dp[j]+1); } } } cout<<dp[k]-1<<endl; return 0; } | cs |
'알고리즘(BOJ) > DP' 카테고리의 다른 글
백준 11048번 - 이동하기 (0) | 2018.01.28 |
---|---|
백준 11057번 - 오르막 수 (0) | 2018.01.28 |
백준 9461번 - 파도반 수열 (0) | 2018.01.28 |
백준 9465번 - 스티커 (0) | 2018.01.28 |
백준 2167번 - 2차원 배열의 합 (0) | 2018.01.25 |