题目背景
对应的选择、判断题:试题 - GESP 202409 C++ 六级 - 洛谷有题
题目描述
小杨有一个正整数 n,小杨想将它拆分成若干完全平方数的和,同时小杨希望拆分的数量越少越好。
编程计算总和为 n 的完全平方数的最小数量。
输入格式
输入只有一行一个正整数 n。
输出格式
输出一行一个整数表示答案。
输入输出样例
输入 #1复制
18
输出 #1复制
2
说明/提示
数据规模与约定
对全部的测试数据,保证 1≤n≤105。
代码实现:
cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 100005;
const int INF = 1e9;
int dp[MAXN];
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i++) dp[i] = INF;
dp[0] = 0;
for(int i = 1; i * i <= n; i++)
{
int sq = i * i;
for(int j = sq; j <= n; j++)
{
dp[j] = min(dp[j], dp[j - sq] + 1);
}
}
cout << dp[n] << endl;
return 0;
}