題目是這樣的:給一個正整數N,找到若干個完全平方數(1,4,9…..)使得他們的和等於n需要讓平方數的個數最少…
例如: n = 12 返回3 12 = 4 + 4+4
n =13 返回 2 13 = 4 + 9
#include<iostream>
#include<cmath>
#include<stack>
using namespace std;
int getresult(int num, stack<int> &_st, int &min, int &cursum)
{
if (num - cursum <= 0) return _st.size();
int last = sqrt(num - cursum);
_st.push(last);
int tmp = last*last;
cursum += tmp;
if (tmp == num || min < _st.size())//增加了剪枝
return _st.size();
int elem = 0;
while (!_st.empty())
{
int res = getresult(num, _st, min, cursum);
if (res < min)
min = res;
elem = _st.top();
cursum -= elem*elem;
_st.pop();
elem--;
if (elem < 1)
{
break;
}
_st.push(elem);
cursum += elem*elem;
}
return min;
}
int getresult(int num)
{
stack<int> _st;
int min = num;
int elem = 0;
int currsum = 0;
int res = getresult(num, _st, min, currsum);
if (res < min)
min = res;
return min;
}
int main()
{
cout << getresult(160006);//如果沒有剪枝那麼會很慢.
//cout << getresult(4);
//cout << getresult(6);
//cout << getresult(12);
//cout << getresult(15);
//cout << getresult(13);
//cout << getresult(18);
}
思想是回溯法,如果不加剪枝函數的話,那麼時間複雜度是O(n!)量級….
加了後快速了很多,,,,程序可能有潛在的bug,且測試用例並不全面,,,如果有歡迎指出….