完全平方数
Posted fate-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了完全平方数相关的知识,希望对你有一定的参考价值。
动态规划
对一个数字n来说,组成n的完全平方数的最少个数等于n减去i*i(i*i<=n)后对应的那个数的完全平方数的最少个数加1.
所以我们从一开始来找组成完全平方数的最少个数,一直找到n,
举个栗子
1 1>=1*1,1-1*1=0,组成0的完全平方数的最少个数为0,加1后变1,所以组成1的完全平方数的最少个数为1
2 2>=1*1,2-1*1=1,组成1的完全平方数的最少个数为1,加1后变2,所以组成2的完全平方数的最少个数为2
3 3>=1*1,3-1*1=2,组成2的完全平方数的最少个数为2,加1后变3,所以组成3的完全平方数的最少个数为3
4 4>=1*1,同时,4也>=2*2,这时,将这两种情况分开来讨论,取最小值,
第一种情况,4>=1*1,4-1*1=3,组成3的完全平方数的最少个数为3,加1后变为4,
第二种情况,4>=2*2,4-2*2=0,组成0的完全平方数的最少个数为0,加1后变为1,
由此可得,最小值为1,所以,组成4的完全平方数的最少个数为1
5 5>=1*1,同时,5也>=2*2,这时,将这两种情况分开来讨论,取最小值
第一种情况,5>=1*1,5-1*1=4,组成4的完全平方数的最少个数为1,加1后变为2
第二种情况,5>=2*2,5-2*2=1,组成1的完全平方数的最少个数为1,加1后变为2
由此可得,最小值为2,所以,组成4的完全平方数的最少个数为2
就这样依此类推,理解代码
1 #include<iostream> 2 #include<fstream> 3 #include<vector> 4 #define MAX 0x3f3f3f3f 5 int mina; 6 using namespace std; 7 void num(int n){ 8 vector<int> ans; 9 ans.push_back(0); 10 while(ans.size()<=n){ 11 int m=ans.size(); 12 mina=MAX; 13 for(int i=1;i*i<=m;i++){ 14 mina=min(mina,ans[m-i*i]+1); 15 } 16 ans.push_back(mina); 17 } 18 cout<<ans.back(); 19 20 } 21 int main(){ 22 // fstream file("haha.txt"); 23 int n; 24 cin>>n; 25 // file>>n; 26 num(n); 27 return 0; 28 }
以上是关于完全平方数的主要内容,如果未能解决你的问题,请参考以下文章
c语言程序:编写函数,判断一个正整数是不是为完全平方数,并输出100以内的完全平方数。
蓝桥杯每日一真题—— [蓝桥杯 2021 省 AB2] 完全平方数(数论,质因数分解)
BZOJ_2440_[中山市选2011]完全平方数_容斥原理+线性筛