簡體   English   中英

給定數字數組,形成一個子集,使其可以表示(允許添加數字)給定數組中的任何數字

[英]Given an array of numbers,form a subset such that it can represent(addition of numbers is allowed) any number in the given array

給定一個包含從1到100的所有數字的數組,並給出從array(1到100)的任何數字。

我們需要形成一個子集,該子集具有給定數組中最少的元素數,以便可以表示給定的數字。

如果需要,我們只能將子集中的數字相加以形成給定的數字。

我們不能從子集的相同索引中兩次添加元素。

Few Examples:
Ex:given an array of elements 1,2,3.
Ans:1,2.

如果給定數字為1,則可以直接從子集中表示1。

如果給定數字為2,則可以直接從子集中表示2。

如果給定數字為3,則可以從子集中以1 + 2表示3。

實際上,我們可以在形成子集的同時復制數字

Ex:given an array of elements 1,2.
Ans:1,2 or 1,1.

答案不能只是1,因為我們不能兩次將相同的1加到形式2。

我的一個朋友問我這個問題,我堅持如何進行。

任何建議將大大幫助...

我也不能為這個問題拿出一個像樣的頭銜。這是一個經典的問題嗎?

您可以用貪​​婪的方式解決此問題:反復選擇第一個缺失值。

目前尚不清楚您的數組是否包含從1到100的所有數字,還是僅包含其中一部分。

還不清楚您是否必須使所有數字從1到數組中的最大數字,或者僅是幾個目標值。 我將假定您也必須能夠構造所有中間值。

假設所有數字都存在

首先,我們必須包括數字1。

接下來,我們將數字2包括在內。現在,我們可以將所有數字加到3。

因此,接下來包括數字4。現在,我們可以將所有內容加到1 + 2 + 4 = 7。

因此,接下來包括數字8。現在,我們可以將所有內容加到1 + 2 + 4 + 8 = 15。

...

因此,接下來包括數字2 ^ k。 現在,我們可以使所有內容最大為1 + 2 + ... + 2 ^ k = 2 ^(k + 1)。

因此,對於100個數字,您將需要1,2,4,8,16,32,64,並且每個數字最多可以包含127。

假設存在數字子集

假設數組可能是一個子集,例如[1,2,3,5,7,9,15]。 相同的基本方法可行,但是這次我們需要選擇數組中小於或等於第一個缺失值的最大數字。

首先包括1。

接下來包括2,我們現在最多可以使數字3。

接下來,我們的第一個缺失值為4,但是我們沒有4可以選擇,因此選擇3。現在,我們可以達到1 + 2 + 3 = 6。

接下來,我們的第一個缺失值為7,因此我們可以選擇7。我們的覆蓋范圍現在為1 + 2 + 3 + 7 = 13。

接下來,我們的缺失值是14,但是我們沒有14,因此選擇9,依此類推。

暫無
暫無

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

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