动态规划
对一个数字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
就这样依此类推,理解代码
#include<iostream> #include<fstream> #include<vector> #define MAX 0x3f3f3f3f int mina; using namespace std; void num(int n){ vector<int> ans; ans.push_back(0); while(ans.size()<=n){ int m=ans.size(); mina=MAX; for(int i=1;i*i<=m;i++){ mina=min(mina,ans[m-i*i]+1); } ans.push_back(mina); } cout<<ans.back(); } int main(){ // fstream file("haha.txt"); int n; cin>>n; // file>>n; num(n); return 0; }