我想寫的算法(在C
)TRUE
或FALSE
(1
或0
),這取決於是否在輸入給定的陣列A
可以「總和和/或子」來x
(見它返回以下澄清)。請注意,A
的所有值都是隨機(均勻)採樣的[1,x-1]之間的整數。
澄清和實施例
所謂「總和和/或子」,我的意思是把「+」和「 - 」,在陣列的每個元件的前面和求和。我們稱之爲。
int SumSub (int* A,int x)
{
...
}
SumSub({2,7,5},10)
應該返回TRUE
爲7-2 + 5 = 10。您會注意到A
的第一個元素也可以被視爲負數,因此A
中元素的順序無關緊要。
SumSub({2,7,5,2},10)
應該返回FALSE
因爲沒有方法來「總和和/或子」的array
元素達到x
值。請注意,這意味着必須使用A
的所有元素。
複雜
設n
是A
長度。如果必須探索所有可能的組合和減號,則問題的複雜性爲O(2^n)。然而,一些組合比其他組合更有可能,因此值得首先探討(希望輸出將是TRUE
)。通常,要求減去最大數量的所有元素的組合是不可能的(因爲A
的所有元素均低於x
)。另外,如果n>x
,嘗試添加A
的所有元素是沒有意義的。
問題
我應該如何去寫這個功能呢?
聽起來像一個典型的揹包問題。數組的元素和大小是否有限制? – sashas
我想用我的資源可以處理的大小(CPU時間)大小的數組。 「A」的元素在[1,x-1]之間有界,其中'x'可以是任何無符號整數。 –
應該*數組中的所有*值用於* sum和/或sub *操作嗎? – trincot