109年普考資料處理概要

四、請問下列程式執行後,印出結果為何?(作答必須解釋計算過程,只寫答案而未加解釋,只能得部分分數。)(25分)

    #include <iostream>

    using namespace std;

    bool sqst(int arr[ ], int n, int sum) {

        if(sum == 0) { return true; }

        if(n < 0 || sum < 0) { return false; }

        bool include = sqst(arr, n-1, sum-arr[n]);

        bool exclude = sqst(arr, n-1, sum);

        return include || exclude;

    }

    int main( ) {

        int arr[ ] = {7, 3, 2, 5, 8};

        int sum = 14;

        int n = sizeof(arr)/ sizeof(arr[0]);

        if(sqst(arr, n - 1 , sum)) cout << "Yes";

        else cout << "No";

        return 0;

    }

答:

()印出結果

1.程式是判斷在給定的數列 arr 中,是否存在一個子集,其數字的總和等於 sum

2. n = 4 (也就是數字 8) 時,有兩個選擇:

  (1)包含8,然後從 {7, 3, 2, 5} 中尋找總和為14-8 = 6的數字組合。

  (2)不包含8,直接在 {7, 3, 2, 5} 中尋找總和為14的數字組合。

  以上的每個選擇會再帶來兩個新的選擇,這就是遞迴的過程。

3.透過不斷的選擇 arr[n] 和不選擇 arr[n],程式嘗試找出是否有一組數字的總和可以等於 14

4.在這個程式中,答案是 Yes,因為7+2+5 = 14。所以程序會在某個遞迴分支上返回 true

()計算過程

sqst(arr, 4, 14)

    sqst(arr, 4-1, 14-arr[4]) = sqst(arr, 3, 14-8) = sqst(arr, 3, 6)

    sqst(arr, 4-1, 14) = sqst(arr, 3, 14)

sqst(arr, 3, 6)

    sqst(arr, 3-1, 6-arr[3]) = sqst(arr, 2, 6-5) = sqst(arr, 2, 1)

    sqst(arr, 3-1, 6) = sqst(arr, 2, 6)

sqst(arr, 2, 1)

    sqst(arr, 2-1, 1-arr[2]) = sqst(arr, 1, 1-2) = sqst(arr, 1, -1)

    sqst(arr, 2-1, 1) = sqst(arr, 1, 1)

sqst(arr, 1, -1)return false;

sqst(arr, 1, 1)

    sqst(arr, 1-1, 1-arr[1]) = sqst(arr, 0, 1-3) = sqst(arr, 0, -2)

    sqst(arr, 1-1, 1) = sqst(arr, 0, 1)

sqst(arr, 0, -2)return false;

sqst(arr, 0, 1)

    sqst(arr, 0-1, 1-arr[0]) = sqst(arr, -1, 1-7) = sqst(arr, -1, -6)

    sqst(arr, 0-1, 1) = sqst(arr, 0, 1) = sqst(arr, -1, 1)

sqst(arr, -1, -6)return false;

sqst(arr, -1, 1)return false;

sqst(arr, 2, 6)

    sqst(arr, 2-1, 6-arr[2]) = sqst(arr, 1, 4)

    sqst(arr, 2-1, 6) = sqst(arr, 1, 6)

sqst(arr, 1, 4)

    sqst(arr, 1-1, 4-arr[1]) = sqst(arr, 0, 4-3) = sqst(arr, 0, 1)

    sqst(arr, 1-1, 4) = sqst(arr, 0, 4)

sqst(arr, 0, 4)

    sqst(arr, 0-1, 4-arr[0]) = sqst(arr, -1, 4-7) = sqst(arr, -1, -3)

    sqst(arr, 0-1, 4) = sqst(arr, -1, 4)

sqst(arr, -1, -3)return false;

sqst(arr, -1, 4)return false;

sqst(arr, 3, 14)

    sqst(arr, 3-1, 14-arr[3]) = sqst(arr, 2, 14-5) = sqst(arr, 2, 9)

    sqst(arr, 3-1, 14) = sqst(arr, 2, 14)

sqst(arr, 2, 9)

    sqst(arr, 2-1, 9-arr[2]) = sqst(arr, 1, 9-2) = sqst(arr, 1, 7)

    sqst(arr, 2-1, 9) = sqst(arr, 1, 9)

sqst(arr, 1, 7)

    sqst(arr, 1-1, 7-arr[1]) = sqst(arr, 0, 7-3) = sqst(arr, 0, 4)

    sqst(arr, 1-1, 7) = sqst(arr, 0, 7)

sqst(arr, 0, 7)

    sqst(arr, 0-1, 7-arr[0]) = sqst(arr, -1, 7-7) = sqst(arr, -1, 0)

    sqst(arr, 0-1, 7) = sqst(arr, -1, 7)

sqst(arr, -1, 0)return true;

sqst(arr, -1, 7)return false;

sqst(arr, 1, 9)

    sqst(arr, 0-1, 9-arr[1]) = sqst(arr, -1, 9-3) = sqst(arr, -1, 6)

    sqst(arr, 0-1, 9) = sqst(arr, -1, 9)

sqst(arr, -1, 6)return false;

sqst(arr, -1, 9)return false;

arrow
arrow
    文章標籤
    普考程式設計概要
    全站熱搜

    jacksaleok 發表在 痞客邦 留言(0) 人氣()