※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 3933번 문제인 라그랑주의 네 제곱수 정리이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/3933

 

문제로 주어지는 수가 2의 15승, 즉 32768 이하이고, 각 수의 합을 구성할 수 있는 수는 32768 이하의 제곱수 181가지뿐임을 확인하자.

 

이를 이용하면 이 문제를 0-1 배낭문제(0-1 knapsack)와 같은 형태로 모델링해 해결할 수 있음을 어렵지 않게 관찰할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int dp[5][32768];
int N;

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    dp[0][0] = 1;
    for (int i = 1; i * i < 32768; i++) {
        for (int k = 1; k < 5; k++) {
            for (int ii = i * i; ii < 32768; ii++) {
                dp[k][ii] += dp[k - 1][ii - i * i];
            }
        }
    }

    cin >> N;
    while (N) {
        cout << dp[1][N] + dp[2][N] + dp[3][N] + dp[4][N] << '\n';
        cin >> N;
    }
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 5351 // C++] Coin Row  (0) 2024.07.06
[BOJ 5081 // C++] Constellations  (0) 2024.07.05
[BOJ 30510 // C++] 토마에 함수  (1) 2024.07.03
[BOJ 30509 // C++] 그래서 나는 코딩을 그만두었다  (0) 2024.07.02
[BOJ 6798 // C++] Knight Hop  (1) 2024.07.01

+ Recent posts