簡體   English   中英

有沒有辦法讓我的程序可以制作任何給定大小的子集?

[英]is there a way that my program can make subsets of any given size?

我正面臨一個問題。

#include <iostream>

using namespace std;
bool Check(int arr[], int size, int con)
{
    for (int i = 0; i < size; i++)
    {
        if (arr[i] == con)
        {
            return true;
        }
        for (int j = i+1; j < size;j++)
        {
            if (arr[i]+arr[j] == con)
            {
                return true;
            }
            for (int k = j + 1; k < size; k++)
            {
                if (arr[i] + arr[j] + arr[k] == con)
                {
                    return true;
                }
                for (int l = k + 1; l < size;l++)
                {
                    if (arr[i] + arr[j] + arr[k] + arr[l] == con)
                    {
                        return true;
                    }
                }
            }
        }
    }
}


int main()
{
    int size;
    int con;
    cout << "Enter desire size of array" << endl;
    cin >> size;
    cout << "ENter number" << endl;
    cin >> con;
    int *arr = new int[size];
    for (int i = 0; i < size; i++)
    {
        cin >> *(arr + i);
    }
    if (Check(arr, size, con) == true)
    {
        cout << "YESSS!!";
    }
    else
    {
        cout << "NOOO!!";
    }
}

我必須制作數組的子集並單獨添加它們({1,2} = 1+2)。 如果我得到的結果與用戶輸入 (con) 匹配,則輸出將為 YES 或 NO。

現在我面臨的問題是我不知道用戶會輸入多少尺寸。 如果他/她輸入數組的大小為 4,則需要 4 個循環。 我的子集程序是否適用於每種大小的數組?

這是您的函數的遞歸實現的一個簡單示例:

bool Check(int *arr, int size, int con, int curr_sum = 0)
{       
    for (int i = 0; i < size; i++)
    {
        int new_sum = curr_sum + arr[i];
        if (new_sum == con
            || Check(arr + i, size - i, con, new_sum))
        {
            return true;
        }
    }
    return false;
}

這是它的工作原理...

我們傳遞一個curr_sum參數,該參數保存來自父遞歸的總和。 當前遞歸將通過將其所有索引添加到它,尋找curr_sum + arr[i] == con 如果不是,那么我們將采用新的總和 ( curr_sum + arr[i] ) 並在我們當前查看的那個之后從索引開始進行另一輪遞歸。

當心:這是您正在使用的 O(n^2) 實現,因此在處理較大尺寸的數組時會非常慢(並且由於這是遞歸,容易發生堆棧溢出)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM