Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 재귀
- 이분 탐색
- 세그먼트 트리
- 우선순위 큐
- 크루스칼
- 클래스
- 중복 순열
- MST
- 그리디
- BeautifulSoup
- 백트래킹
- 링크드리스트
- 순열
- 스택
- DP
- 조합
- 문자열
- BFS
- 완전 탐색
- dfs
- SSAFY
- 분할 정복
- 피보나치 수
- 메모리풀
- lis
- 시뮬레이션
- 빠른 입출력
- Knapsack
- 큐
- 비트마스크
Archives
- Today
- Total
작심 24/7
[백준] 1699번 제곱수의 합 본문
동전 2 문제와 같은 방식으로 점화식
DP[n]=최솟값(DP[n], DP[n-현재 제곱수] + 1)
으로 풀면 되는 문제이다.
제곱수들을 동전으로 생각하고 자연수 N을 목표하는 가치 K로 생각하면 된다.
N이 13이라면 제곱수들은 1, 4, 9로 이루어져 있어야 하고
N이 50이라면 제곱수들은 1, 4, 9, 16, 25, 36, 49로 이루어져 있어야 한다.
이 제곱수들을 조합하여 1~N까지의 수를 만들어 나가며
필요한 최소 개수를 저장시키면 된다.
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int main() {
int N;
cin >> N;
int dp[100001] = { 0 };
for (int i = 1; i <= N; i++) dp[i] = i;
for (int i = 2; i <= sqrt(N); i++) {
for (int j = i * i; j <= N; j++) {
dp[j] = min(dp[j], dp[j - i * i] + 1);
}
}
cout << dp[N];
return 0;
}
'백준' 카테고리의 다른 글
[백준] 11051번 이항 계수 2 (0) | 2020.06.22 |
---|---|
[백준] 11057번 오르막 수 (2) | 2020.06.22 |
[백준] 2294번 동전 2 (0) | 2020.06.21 |
[백준] 9465번 스티커 (0) | 2020.06.20 |
[백준] 1039번 교환 (0) | 2020.06.19 |
Comments