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;
    }
  • 相关阅读:
    并发编程之多线程(理论部分)
    基于TCP和UDP的socket
    ajax笔记 显示出所城市名称 ShowCity.aspx Html代码
    蒸饭的纱布
    ajax 笔记--不刷新实现简单的留言版 guestBook
    从表的第几条取到第几条记录
    在asp.net添加数据到XML里去
    ajax 笔记-- 写了一个不用刷新就能实现--用户名验证的例子
    今天生日
    ajax 笔记不用刷新实现数据的分页显示
  • 原文地址:https://www.cnblogs.com/fate-/p/12229751.html
Copyright © 2011-2022 走看看