Plite
전자오락 공방
Plite
전체 방문자
오늘
어제
  • 분류 전체보기 (274)
    • 프로젝트 (18)
      • 완성 프로젝트 (3)
      • 프로젝트 진행 내역 (15)
    • 공부 및 정리 (241)
      • 백준 코드 (222)
      • C++ (8)
      • DirectX (2)
      • Unreal Engine (6)
      • 프로그래밍 패턴 (3)
    • 기타 (12)
      • 기타 주저리 (10)
    • 게임과 취미 (1)
    • 대문 (1)

블로그 메뉴

  • 홈
  • 프로젝트
  • 취미, 일상
  • 백준 프로필

공지사항

  • [Read Me]
  • 제 블로그에 방문하신 것을 환영합니다.

인기 글

태그

  • 수학
  • 유니온 파인드
  • C++
  • 큐
  • 구현
  • 최소 스패닝 트리
  • 브루트포스
  • 백준
  • SCC
  • UC++
  • 위상 정렬
  • 트리
  • LCA
  • 분할정복
  • 스택
  • 정수론
  • 트라이
  • 정렬
  • KMP
  • 문자열
  • 기하
  • 조합론
  • 세그먼트 트리
  • 백트래킹
  • 그래프
  • 이분탐색
  • 우선순위큐
  • 누적합
  • 투포인터
  • 동적계획법

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Plite

전자오락 공방

[C++]백준 - 2293번 문제
공부 및 정리/백준 코드

[C++]백준 - 2293번 문제

2021. 8. 13. 16:17

2293번: 동전 1 (acmicpc.net)

 

2293번: 동전 1

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

www.acmicpc.net

 

2293번 : 동전 1


n가지 종류의 동전이 있다. 각각의 동전이 나타내는 가치는 다르다. 이 동전을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다. 그 경우의 수를 구하시오. 각각의 동전은 몇 개라도 사용할 수 있다.

사용한 동전의 구성이 같은데, 순서만 다른 것은 같은 경우이다.

 

입력


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

 

 

출력


첫째 줄에 경우의 수를 출력한다. 경우의 수는 231보다 작다.

 

 

 


 

생각해 볼 점


동적 프로그래밍으로 푸는 문제입니다.

 

그리고, 냅색 알고리즘과 상당히 흡사합니다.

 

Dynamic Programming: 배낭 채우기 문제 (Knapsack Problem) (tistory.com)

 

Dynamic Programming: 배낭 채우기 문제 (Knapsack Problem)

도둑이 보석가게에 배낭을 메고 침입했다. 배낭의 최대 용량은 W이며, 이를 초과해서 보석을 담으면 배낭이 찢어질 것이다. 각 보석들의 무게와 가격은 알고 있다. 배낭이 찢어지지 않는 선에서

gsmesie692.tistory.com

배낭 문제를 정통적으로 풀려면 DP 배열을 이차원 배열로 잡아주는 게 좋지만, 저는 공간을 아끼기 위해 일차원 배열로 하겠습니다.

 

입력을 하나 받을 때마다 경우의 수를 계산하여 더해준다면, 일차원 배열로도 충분합니다.

 

* 문제를 해결하기 위해 생각한 내용

 

1. 동전 2원만 입력 받았을 때 : (2 * n) 원을 만들 수 있는 경우의 수 = 1

2. 동전 3원을 추가했을 때 :

 

n원을 만들 수 있는 경우의 수 = 기존 DP[n] + DP[n-3] + DP[n-6] + ....

코드


#include <iostream>
using namespace std;

int main() 
{
	int N, K;
	cin >> N >> K;
	
	int *dp = new int[K + 1];
	fill_n(dp, K + 1, 0);
	
	dp[0] = 1;       //동전을 0개 사용하면 0의 값을 만들 수 있으므로 1 
	for(int t = 1; t < N + 1; t++)
	{
	    int coin;
	    cin >> coin;
	    
	    for(int i = K; 0 < i; i--)
	    {
	        int count = 0;
	        for(int j = i; 0 <= j; j -= coin) count += dp[j];
	        dp[i] = count;
	    }
	}
	
	
    cout << dp[K];

    delete[] dp;
	return 0;
}

 

그 외


 

저작자표시 (새창열림)

'공부 및 정리 > 백준 코드' 카테고리의 다른 글

[C++]백준 - 2206번 문제  (0) 2021.08.13
[C++]백준 - 7579번 문제  (0) 2021.08.13
[C++]백준 - 1697번 문제  (0) 2021.08.08
[C++]백준 - 10942번 문제  (0) 2021.08.08
[C++]백준 - 1520번 문제  (0) 2021.08.05
    '공부 및 정리/백준 코드' 카테고리의 다른 글
    • [C++]백준 - 2206번 문제
    • [C++]백준 - 7579번 문제
    • [C++]백준 - 1697번 문제
    • [C++]백준 - 10942번 문제
    Plite
    Plite
    개발 일지, 게임 이야기 등을 적어두는 공간입니다.

    티스토리툴바