다이나믹 프로그램을 사용한다. 재귀적 방법을 사용했다. 연주가능하면 1 불가능하면 0 방식을 사용해 시작점부터 마치 분할 정복 하듯이 내려간다. 하지만 분할 정복은 아니다 왜냐하면 만약 같은 볼륨 값을 가르키는 지점에 여러 전 곡에서 도달했을 때 한 가지 경우만 세면 되기 때문이다.
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 35 36 37 38 | #include <iostream> using namespace std; int n, s, m; int d[105][1005]; int v[105]; void go(int cur_n, int cur_vol) { if (d[cur_n][cur_vol] != 0) return; d[cur_n][cur_vol] = 1; if (cur_n == n) return; if (cur_vol - v[cur_n + 1] >= 0) { go(cur_n + 1, cur_vol - v[cur_n + 1]); } if (cur_vol + v[cur_n + 1] <= m) { go(cur_n + 1, cur_vol + v[cur_n + 1]); } return; } int main() { cin >> n >> s >> m; for (int i = 1;i <= n; ++i) cin >> v[i]; go(0, s); int ans = -1; for (int i = 0;i <= m; ++i) if (d[n][i] == 1) ans = i; cout << ans << endl; return 0; } | cs |
'백준 온라인 저지' 카테고리의 다른 글
백준 5557: 1학년 (0) | 2018.08.04 |
---|---|
백준 2294: 동전2 (0) | 2018.08.04 |
백준 2293: 동전 1 (0) | 2018.08.04 |
백준 10942: 팰린드롬? (0) | 2018.07.31 |
백준 1890: 점프 (0) | 2018.07.31 |