題目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;
}