2293번: 동전 1
첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다.
www.acmicpc.net
top-down 방식으로 풀어보려다 너무 많은 시간을 허비한 문제였다.
동전의 순서만 다른 경우를 가려내기 위해선 2차원 dp 배열을 선언해야 하는데 dp[101][10001] 으로 선언하게 되면 메모리가 4mb를 넘게되어 메모리 초과가 발생하게 된다.
bottom-up 방식으로 풀었더니 코드도 훨씬 간결하고 쉽게 풀렸다.
틀에 박힌 사고를 개선해야 한다는 것을 다시한번 느끼게 된 문제였다.
#include <iostream>
using namespace std;
int n, k, pay[101], memo[10001];
int Bottomup(int k)
{
memo[0] = 1;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= k; j++)
if(j - pay[i] >= 0)
memo[j] += memo[j - pay[i]];
return memo[k];
}
int main(void)
{
cin >> n >> k;
for (int i = 1; i <= n; i++)
cin >> pay[i];
cout << Bottomup(k) << endl;
return 0;
}
알고리즘 200일 프로젝트 - 77 day
'알고리즘 > BOJ' 카테고리의 다른 글
백준 11055번: 가장 큰 증가 부분 수열 (0) | 2020.06.22 |
---|---|
백준 1699번: 제곱수의 합 (0) | 2020.06.20 |
백준 11057번: 오르막 수 (0) | 2020.06.18 |
백준 1010번: 다리 놓기 (0) | 2020.06.18 |
백준 9465번: 스티커 (0) | 2020.06.16 |