创新工场软工题2-2

来源:互联网 发布:手机时钟主题软件 编辑:程序博客网 时间:2024/05/14 22:02

题目2:

给一个正整数 n, 找到若干个完全平方数(比如1, 4, 9, … )使得他们的和等于 n。你需要让平方数的个数最少。
给出 n = 12, 返回 3 因为 12 = 4 + 4 + 4。
给出 n = 13, 返回 2 因为 13 = 4 + 9。


第二题:完整代码:C++

// 2016/9/6更新#include<iostream>#include<vector>using namespace std;int NumOfSquare(int num){    if(num<1) return 0;    if(num==1) return 1;    //找出完全平方数,记录在数组容器中    vector<int> arr;    int temp=1;    for(int i=2; temp<num; i++)    {        arr.push_back(temp);        temp=i*i;                   }    const int n=arr.size();     int MinNum=num;  //初值为最大次数    //设置两个容器,记录最相加的平方数    vector<int> Current;   //当前最少数字平方数    vector<int> Candidate;  //候选最少数字平方数    for(int i=n-1; i>=0; i--)    {        int leftNum=num;  //贪心算法        int CandidateMin=0;    //候选最小次数        for(int j=i; j>=0; j--)        {            if(leftNum==arr[j])            {                Candidate.push_back(arr[j]);                CandidateMin++;                break;            }            while(leftNum>arr[j])            {                Candidate.push_back(arr[j]);                leftNum-=arr[j];                CandidateMin++;            }        }        //更新最小平方和的数目        //MinNum=(MinNum<CandidateMin?MinNum:CandidateMin);        if(MinNum>CandidateMin)        {            MinNum=CandidateMin;            Current.clear();            Current.assign(Candidate.begin(),Candidate.end());            Candidate.clear();        }    }    //输出    for(int i=0; i<Current.size(); i++)        cout<<Current[i]<<" ";    cout<<endl;    return MinNum;}int main(){    cout<<NumOfSquare(13)<<endl;    cout<<endl;    cout<<NumOfSquare(100)<<endl;}
3 0
原创粉丝点击