zoukankan      html  css  js  c++  java
  • 完全平方数

    动态规划

    对一个数字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;
    }
  • 相关阅读:
    OSI安全体系结构
    PHP 二维数组根据相同的值进行合并
    Java实现 LeetCode 17 电话号码的字母组合
    Java实现 LeetCode 16 最接近的三数之和
    Java实现 LeetCode 16 最接近的三数之和
    Java实现 LeetCode 16 最接近的三数之和
    Java实现 LeetCode 15 三数之和
    Java实现 LeetCode 15 三数之和
    Java实现 LeetCode 15 三数之和
    Java实现 LeetCode 14 最长公共前缀
  • 原文地址:https://www.cnblogs.com/fate-/p/12229751.html
Copyright © 2011-2022 走看看