迴圈

輸入n m

輸入數字

將數字小到大排序

開始搜尋

 

搜尋

迴圈

判別是否可加

相加 (即可用空間減少)

紀錄數字 及 位置

如果可用空間 = 0

輸出

 

將以加部分拿出

並且設定下次開始判別的位置

 

若下次判別的位置回到0或超出範圍(n)

跳出迴圈

 

 

 

註:

i--  :  因為for迴圈會把i+1所以先減在加

ansPtr < n : 此情況發生在 級數<m 時

 

 

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

void search_seq();
void print();

int n, m;
int arr[35];
int ans[35][2];
int ansPtr;

int main()
{
    while(cin >> n >> m)
    {
        for(int i = 0; i<n; i++)
            cin >> arr[i];

        sort(arr, arr+n);

        search_seq();
    }
}

void search_seq()
{
    bool Bprint = false;
    int leave;
    int i;

    memset(ans, 0, sizeof(ans));

    for(ansPtr = i = 0, leave = m; ansPtr < n ; i++)
    {
        if(arr[i] <= leave && i<n)
        {
            leave -= arr[i];
            ans[ansPtr][0] = arr[i];
            ans[ansPtr++][1] = i;

            if(leave == 0)
            {
                print();
                Bprint = true;
            }

        }
        else
        {
            while( (i==n || leave < arr[i]) && ansPtr > 0)
            {
                leave += ans[--ansPtr][0];
                ans[ansPtr][0] = 0;
                i = ans[ansPtr][1] + 1;
            }

            if( (leave < arr[i] && ansPtr == 0) || i==0 || i == n)
                break;

            i--;
        }
    }

    if(Bprint == false)
        cout << "-1\n";
}

void print()
{
    for(int i = 0; i<ansPtr; i++)
        cout << ans[i][0] << " ";
    cout << endl;
}
 

 

arrow
arrow
    全站熱搜

    大神(偽) 發表在 痞客邦 留言(0) 人氣()