[GESP202409 六级] 小杨和整数拆分

GESP编程共123题,本题是整站第1436题,已经有人完成了本题,加油!

题目描述

小杨有一个正整数 n,小杨想将它拆分成若干完全平方数的和,同时小杨希望拆分的数量越少越好。

编程计算总和为 n 的完全平方数的最小数量。

输入格式

输入只有一行一个正整数 n。

输出格式

输出一行一个整数表示答案。

输入输出样例

输入 #1

18

输出 #1

2

说明/提示

数据规模与约定

对全部的测试数据,保证 1≤n≤10^5。

别灰心,再试一次!

真题解析

解析:

题目大意:给定一个正整数n,将其拆分成若干个完全平方数的和,要求拆分的数量越少越好。求最少需要多少个完全平方数才能构成n。

用DP进行求解

状态定义

设dp[i]表示构成整数i的最少完全平方数的数量。

状态转移方程

考虑如何通过已知的dp[j](其中j < i)来推导出dp[i]。

对于任意一个整数i,我们可以考虑将它拆分成一个完全平方数j2加上剩余部分i - j2 的和。因此,    

dp[i]可以通过dp[i - j2] 来推导出来,即:

dp[i] =min 1≤ k ≤ i (dp[ i−j 2 ]+1)

解释:

dp[i - j2] 表示剩余部分 i - j2 的最少完全平方数数量。+ 1 表示当前添加了一个完全平方数 j2。

我们需要取所有可能的 j 的最小值,以确保 dp[i] 最小。

参考程序

本站题目仅供学习,GESP版权归CCF所有,如有侵权请联系删除。站长陈老师QQ及微信:208234。