《演算法筆記上機實驗指南》第4章 入門篇(2)8.1

wsfhdhjs發表於2020-09-24

A1103:

/*
    南牆:
        1.所選擇的數的p次方之和==n+選擇底數個數剛好為n
        2.如果有最大的底數之和則更新
        3.然後返回空
    分支:
        1.不用訪問0那個數

        2.選擇加入:價將底數index加入到臨時陣列vector中,然後DFS,index就是當前加入到臨時陣列temp中的那個數,同時總的 選的數字個數要改變 選擇的數的p次方之和要改變 總的和也要改變
        3.選擇不加入:將剛才那個放入陣列中的數,彈出,然後訪問下一個,剩下的引數不變

    初始化陣列fac:
        1.void 型別
        2.變數 i=0 temp=0
        3.while迴圈條件:temp<=n,將temp放入到陣列中,然後改變temp的值

    index訪問的數字就是按照從0開始,進行升序排列的

    其實本道題和例子中那個,就多了一個要訪問最優序列


    如果最後的底數之和沒有發生任何改變的,就表示麼有任何合適的序列,則輸出-1
*/

#include<iostream>
#include<vector>
using namespace std;

vector<int> fac,temp,ans;

int n,p,k,maxnbottom=-1;


int power(int x)        //計算x的p次方
{
    int ans=1;
    //等會來看這個問題
    while(p!=0)
    {
        ans*=x;
        p--;
    }
      /*for(int i=0; i<p; i++)
        ans*=x;*/
    return ans;
}

void init()
{
    int temp=0,i=0;
   //for(int temp=0; temp<=n; temp=power(i++))
    while(temp<=n)
    {
        fac.push_back(temp);    //將temp放入到陣列vector中其實就是按照0,1,2,3,4,5....的順序進行放入的
        temp=power(++i);
    }
}

void DFS(int index, int Nown, int sum, int num)      //4個引數分別表示:當前訪問的指數,當前訪問的底數個數,當前訪問的p次方的個數之和,底數之和
{
    if(sum==n && Nown==k)
    {
        if(num>maxnbottom)
        {
            maxnbottom=num;
            ans=temp;
        }
        return ;
    }
    if(sum>n || Nown>k)
        return ;
    if(index-1>=0)
    {
        temp.push_back(index);
        DFS(index,Nown+1,sum+fac[index],num+index);
        temp.pop_back();
        DFS(index-1,Nown,sum,num);
    }
}



int main()
{
    cin >> n >> k >> p;
    init();
    DFS(fac.size()-1,0,0,0);
    if(maxnbottom==-1)
        cout << "Impossible" << endl;
    else
    {
        printf("%d = %d^%d",n,ans[0],p);
        for(int i=1; i<ans.size(); i++)
        {
            printf(" + %d^%d",ans[i],p);
        }
    }
    return 0;

}

這裡有個小問題:

//在使用下面這個程式中,對於power函式而言,使用while和for不一樣,使用while會導致記憶體不夠,而使用for可以,因為while迴圈結束後不回從記憶體中釋放掉空間,但是for迴圈結束後是會從空間中釋放掉記憶體。所以我總結的是,在init的函式中,不管是使用while還是for都不影響,唯一合理的解釋是,在init中呼叫,power函式,是需要開闢空間的,而power函式中使用while是不會釋放空間,所以導致記憶體不夠,如果使用for迴圈,在power函式迴圈結束時,會釋放掉空間,所以不會超過記憶體
#include<iostream>
#include<vector>
using namespace std;

vector<int> fac,temp,ans;

int n,p,k,maxnbottom=-1;


int power(int x)        //計算x的p次方
{
    int ans=1;

    while(p!=0)
    {
        ans*=x;
        p--;
    }
      /*for(int i=0; i<p; i++)
        ans*=x;*/
    return ans;
}

void init()
{
    int temp=0,i=0;
    while(temp<=n)
    {
        fac.push_back(temp);    //將temp放入到陣列vector中其實就是按照0,1,2,3,4,5....的順序進行放入的
        temp=power(++i);
    }
}


int main()
{
    cin >> n >> k >> p;
    init();
    return 0;
}


相關文章