关闭

创新工场软工题2-2

标签: 贪心算法
547人阅读 评论(5) 收藏 举报
分类:

题目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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:15000次
    • 积分:1067
    • 等级:
    • 排名:千里之外
    • 原创:92篇
    • 转载:15篇
    • 译文:0篇
    • 评论:18条
    最新评论