給一個正整數n,找出個數最小的平方數讓他們的和等於n

題目是這樣的:給一個正整數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,且測試用例並不全面,,,如果有歡迎指出….

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章