創新工場軟工題2-2

題目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;
}
發佈了90 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章