동전 1
16 August 2019
문제 : https://www.acmicpc.net/problem/2293
이번은 더 이상 사용되지 않는 값을 버림으로써 공간 복잡도를 향상시키는 문제를 풀어보도록 하겠습니다.
#include<stdio.h>
static int* arr;
static int* dp;
int main(void) {
int N, TOTAL;
scanf("%d %d", &N, &TOTAL);
dp = new int[TOTAL + 1];
arr = new int[N];
for (int i = 0; i < N; i++)
{
scanf("%d", &arr[i]);
}
dp[0] = 1;
for (int i = 0; i < N; i++)
{
for (int k = 0; k <= TOTAL; k++)
{
if (k - arr[i] >= 0)
{
dp[k] += dp[k - arr[i]];
}
}
}
printf("%d", dp[TOTAL]);
return 0;
}
여러 동전의 합으로 만들 수 있는 값의 경우의 수를 구하는 문제입니다.1,2의 동전으로 3을 만든다고 하면 아래와 같이 풀이할 수 있습니다.
f(1,3) = 동전 1로 3을 만들 수 있는 경우의 수
f(2,3) = 동전 1,2로 3을 만들 수 있는 경우의 수
f(2,3) = f(1,3) + f(2,1) = f(1,3) + f(1,1)
만약 1,2의 동전으로 6을 만든다고 하면 아래와 같이 나타낼 수 있습니다.
f(2,6) = f(1,6) + f(2,4) = 2를 쓰지 않고 만드는 경우의 수 + 2를 하나 쓰고 나머지값인 4를 1,2를 모두 써서 만들 수 있는 경우의 수
f(2,4) = f(1,4) + f(2,2) 이므로 이미 f(2,4)에는 f(2,2)가 포함되어 있으므로 f(2,6)을 구할 때는 포함시키지 않습니다.
위와 같이 구현하여 마지막 dp 값을 return해주도록 합니다.