※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 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 |