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 函式,在它不能識別為數字的第一個字元上,停止讀入字串。那些被認為是數值的一部分的符號和字元,例如美圓號與...