#문제

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

 

1699번: 제곱수의 합

어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다. 이 경우, 수학자 숌크라테스는 “11은 3개 항의 제곱수 합으로 표현할 수 있다.”라고 말한다. 또한 11은 그보다 적은 항의 제곱수 합으로 표현할 수 없으므로, 11을 그 합으로써 표현할 수 있는 제곱수 항의 최소 개수는

www.acmicpc.net

 

#작성 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;
 
int n;
int dp[100001];
    //[i] : j를 만드는 방법의 수 
 
int main(){
    // n입력
    cin>>n;
    // dp배열을 1로만 이루어진 제곱수의 합(maximum case)으로 초기화한다. 
    for(int i=0; i<=n; i++){
        dp[i] = i;
    }
    
    for(int i=1; i<=n; i++){
        for(int j=1; j*j<=i; j++){
            dp[i] = min(dp[i], dp[i-j*j]+1);
        }
    }
    
    cout<<dp[n] <<'\n';
    return 0
}
cs

##

n보다 작거나 같은 숫자들에 대해, 제곱수의 합의 최소 개수를 갱신해나가면서 답을 구해주어야 한다.

각 i에 대해, 제곱수의 합으로 i를 구성하는 경우 maximum case는 1+1+...+1의 케이스이다.

-> dp[i] = i로 초기화해준다.

 

'BOJ' 카테고리의 다른 글

BOJ 16500번 :: 문자열 판별  (0) 2020.02.03
BOJ 11052번 :: 카드 구매하기  (0) 2020.02.03
BOJ 9465번 :: 스티커  (0) 2020.02.02
BOJ 2618번 :: 경찰차  (0) 2020.02.01
BOJ 10942번 :: 팰린드롬?  (0) 2020.01.28

+ Recent posts