台灣最大程式設計社群網站
線上人數
1412
 
會員總數:243293
討論主題:188076
歡迎您免費加入會員
討論區列表 >> VB.NET >> 請教如何利用迴圈做簡易的分配程式
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
請教如何利用迴圈做簡易的分配程式
價值 : 80 QP  點閱數:424 回應數:6

樓主

郭俊輝
門外漢
0 14
218 6
發送站內信

想請教各位前輩,小弟今天小完成一樣程式
功用大意為做出餘數最少的分配
例如:輸入5種數字(例:5000, 1200, 2000, 4200, 2650)
而目標上限是[9000],要如何判斷上述5種數字哪幾個相加最接近[9000],但不超過[9000]
備註:不一定限定只能2個相加,也可以2種以上數字相加,只要最接近[9000]即可
因小弟對於迴圈方面不太熟練,如有前輩能提供範例,小弟不勝感激,謝謝各位前輩賜教




搜尋相關Tags的文章: [ 迴圈 ] , [ 分配 ] ,
本篇文章發表於2017-12-16 09:05
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

練武功
檢舉此回應
我覺得可以利用排列組合的方式。
5個數取2個、取3個、取4個,找這這些組合,就可以得到答案。
本篇文章回覆於2017-12-16 11:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

小魚
檢舉此回應
如果是5個應該不會很難,
很多個可能要找看看演算法了,
總之先排序再做動作吧。
本篇文章回覆於2017-12-16 12:02
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

Ader Chen
檢舉此回應
好奇寫了一下, 不知道對不對...

本篇文章回覆於2017-12-16 23:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

練武功
檢舉此回應
To 3#
的確是一種不同的想法。
但作者需要找最接近9000的累加個數,與你只找出一種不超過9000的演算法不同。所以你的演算法似乎少了"比較"的功能。

例如上述的數值改成5000, 1200, 2000, 4300, 2650(4200改成4300),答案就不是這樣了。
本篇文章回覆於2017-12-17 09:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

郭俊輝
檢舉此回應
各位前輩好,小弟這幾天沒有使用到電腦沒看到各位前輩回覆,十分抱歉
今天在找資料時發現了別的網站,雖然是用Excel的VBA完成,不過有部分是小弟想要的解答
Sub 按鈕1_Click()
Dim num, ulimit, m%, n%, i%, sum, maxsum, output

num = [a1:f1]
ulimit = [a2]
m = UBound(Application.Transpose(num))

For n = 1 To m

ReDim arr(1 To n)
ReDim tmp(1 To n)

Do While arr(1) <= m - n

For i = 1 To n
If IsEmpty(arr(i)) Then arr(i) = i: GoTo 333

If arr(i) = m - n + i Then
arr(i) = arr(i - 1) + 1
ElseIf i = n Then
arr(i) = arr(i) + 1
ElseIf arr(i + 1) = m - n + i + 1 Then
arr(i) = arr(i) + 1
End If

333:
tmp(i) = num(1, arr(i))
Next i

sum = Application.sum(tmp)
If sum > maxsum And sum <= ulimit Then
maxsum = sum
output = tmp
End If

Loop

Next n

[a4].Resize(1, UBound(output)) = output
[a5] = "加總"
[b5] = maxsum

End Sub

小弟第一次用VBA,可能這幾天多做點功課,搞清楚這些意思,享用這樣的邏輯下去修改寫成自己的程式
Ader Chen前輩的也蠻厲害的,提供小弟很好的思維,感謝Ader Chen前輩

本篇文章回覆於2017-12-18 08:10
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

Ader Chen
檢舉此回應
不好意思, 經四樓 練武功 提醒才發現三樓的程式太狹隘,
應該如一樓所述列舉所有可能的情況、比較出最佳解才完整.
也如二樓 小魚 所述,若項目數太多,可能組合數成天文數字,窮舉法可能非常耗時.

排列組合窮舉法或可參考:
VB.NET 排列組合演算法實現
其結果
a
b
c
d
a&b
a&c
a&d
b&c
b&d
c&d
a&b&c
a&b&d
a&c&d
b&c&d
a&b&c&d
就改成您組合數值的合計, 比較是否符合(<9000)
本篇文章回覆於2017-12-18 08:45
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.