다이나믹을 사용하면 되는 문제 경우의 수가 오지게 많아서 long long 을 써줘야 한다. int 썻다가 피를 봤다.. 원리는 어렵지 않다. 점화식을 세우면 되는데
d[i번째 수를 사용][현재 수] 가 경우의 수를 나타낸다고 했을 때 입력받은 a배열에서 해당 만큼 빼주고 더해주면 된다.
신기한 건 나는 답을 못찾겠을 때 구글에 백준 문제 번호를 검색하는데 내 코딩과 비슷한 사람이 보인다..
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 | #include <iostream> using namespace std; int n; long long d[103][21]; int a[103]; int main() { cin >> n; for (int i = 0; i < n; ++i) cin >> a[i]; d[0][a[0]] = 1; for (int i = 1;i <= n - 2; ++i) for (int j = 0; j <= 20; ++j) { if (d[i - 1][j]) { if (j - a[i] >= 0) d[i][j - a[i]] += d[i - 1][j]; if (j + a[i] <= 20) d[i][j + a[i]] += d[i - 1][j]; } } long long ans = d[n - 2][a[n - 1]]; cout << ans << endl; return 0; } | cs |
'백준 온라인 저지' 카테고리의 다른 글
백준 1495: 기타리스트 (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 |