VB演算法問題,堆數字中湊出指定數字

2021-05-19 11:17:41 字數 2984 閱讀 4839

1樓:匿名使用者

資料20-30個,這個高效與低效,執行時間應該差不了多少吧!

我給個簡單的演算法:

1,將這些資料讀入一個陣列a()

2,對陣列內的資料進行升序排序

3,依次從陣列中取一個數與其他數進行求和

1)先算兩個數之和100的。從a(0)開始,當a(i)>50時,即可跳出迴圈,開始進行三個數之和是100的計算

2)當a(i)>34時,跳出迴圈,進行四個數之和是100的計算3)當a(i)>25時,跳出迴圈,進行五個數之和是100的計算依次類推

2樓:葉成桐

將一堆數字看成一個陣列,從第一個開始,遍歷剩下的數,如果第一個和第n個的和=100,就輸出;遍歷完後,從第二個在開始,遍歷剩下的,如果第二個和第n個的和=100,...............

3樓:匿名使用者

這是個求子集合加總問題(subset sum problem)。是演算法理論中比較有名的np問題。

有幾種經典解法:

1.組合論。 有所有集合元素的組合,然後求和與和目標比較。 方法簡單,但演算法複雜度高,當集合數較大,比如≥ 15後,速度明顯慢;

2. 動態規劃。遞迴求解,屬於典型的divide and conquer方案。

3. 回溯法(backtracking),子集合屬於這個裡面的一個特例。 -- 雖然也要遞迴,但相較上面的方法,在集合比較大的時候,也能保持不錯的效率。

下面給出回溯法的vb**(vb 2010)。

private sub output(byref ta() as integer, byval ta_size as integer)

dim ra(ta_size - 1) as integer 'differ from c/c++

array.copy(ta, ra, ta_size)

dim converter = new converter(of integer, string)(function(num) num.tostring)

dim str = string.join("+", array.convertall(ra, converter))

lbsubset.items.add(str)

end sub

private sub getsubsetsum(byref sa() as integer, byref ta() as integer,

byval sa_size as integer, byval ta_size as integer,

byval sum as integer, byval **t_node as integer, byval target as integer)

dim i as integer

if target = sum then

output(ta, ta_size)

if **t_node + 1 < sa_size and sum - sa(**t_node) + sa(**t_node + 1) <= target then

getsubsetsum(sa, ta, sa_size, ta_size - 1, sum - sa(**t_node), **t_node + 1, target)

end if

return

else

if **t_node < sa_size and sum + sa(**t_node) <= target then

for i = **t_node to sa_size - 1 ' differ from c/c++

ta(ta_size) = sa(i)

if sum + sa(i) <= target then

getsubsetsum(sa, ta, sa_size, ta_size + 1, sum + sa(i), i + 1, target)

end if

next i

end if

end if

end sub

private sub generatesubsets(byref sa() as integer, byval size as integer, byval target as integer)

dim ta(size - 1) as integer

dim total as integer = 0

array.sort(sa)

total = sa.sum

if (sa(0) <= target) and (total >= target) then

getsubsetsum(sa, ta, size, 0, 0, 0, target)

end if

end sub

private sub btnstart_click(sender as system.object, e as system.eventargs) handles btnstart.

click

dim size as integer = 15

dim target as integer = 10

dim data() as integer

dim i as integer

lbsubset.items.clear()

redim data(size - 1) 'differ from c/c++

for i = lbound(data) to ubound(data)

data(i) = i + 1

next i

generatesubsets(data, size, target)

end sub

從1~50中(包括1和50)最多選出( )個數來,剩下的數字中任選2個數的和都不是

4樓:聽不清啊

把被9除餘0的數只留一個,

把被9除餘1、2、3、4全部留下,

把被9除餘5、6、7、8的數全部取走。

剩下的25個數字中任選2個數的和都不是9的倍數。

VB中的msgbox問題,vb中msgbox的問題

msgbox a b 顯示字串連線的結果 象我這麼寫。就對了!vb中msgbox的問題 a msgbox 必須在工資審批任務完成後才能進行更新記錄操作!請選擇是否進行更新記錄操作 vbyesno,確定更新 少了一個逗號吧,vbyesno前面加個逗號看看看其他是沒錯的 因為你點了確定按鈕這時x才會有值...

VB中label的問題,VB中label的一個問題

這是一個奧運會的倒計時器,如下 const adate 8 8 2008 8 40 00 am 常量紐約時間的北京奧運會開幕時間 private sub form load timer1.interval 1000timer1.enabled trueend sub private sub time...

vb怎樣只讀取每行中的數字,VB逐一讀取Text1裡面的數字

看看這兩個函式.應該能解決你的問題了.val 函式 返回包含於字串內的數字,字串中是一個適當型別的數值。語法val string 必要的 string 引數可以是任何有效的字串表示式.說明val 函式,在它不能識別為數字的第一個字元上,停止讀入字串。那些被認為是數值的一部分的符號和字元,例如美圓號與...