小弟工作的第一个任务~

yelang771 2004-07-26 11:51:19
用vb实现如下功能:
可以任意输入一组数字 如:1,11,20,22,22,23,25,45,68,92,111,356,================

给出一个数字,如:45

要能得到 所有输入数字的相加的组合是 给出的数字(45)


如上面就是得到1+22+22;20+25,22+23,45 =======

大家给点建设性的建议,谢谢~
...全文
282 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
yelang771 2004-07-27
  • 打赏
  • 举报
回复
回 :northwolves(狼行天下)

我看了。。那个问题是解决了

我比较菜。 现在看明白了 换成n就可以了

不过我每次计算时 多得这行代码吗?

Private Sub Command1_Click()
Dim S() As String
GETALL "1,11,20,22,22,23,25,45,68,92,111,356", 45, S '和为19 时
End Sub

我想在运行的界面里输入数字
就是输入一个数字 接着输下一个数字 ,直到输完



-----------------------------------------------

Private Sub Command1_Click()
Dim x As String
x = InputBox("please enter numbers splitted by "",""", "INFORMATION", "11,12,13,14,15,16,17")
Dim S() As String
GETALL x, 45, S '和为45 时
End Sub
ryuginka 2004-07-26
  • 打赏
  • 举报
回复
up
yelang771 2004-07-26
  • 打赏
  • 举报
回复
谢谢 dongge2000(秋日私语)
我说的这是一个列子 其实是这样的问题:可以任意输入一组数字 ,给出一个数字,要能得到 所有输入数字的相加的组合是 给出的数字
dongge2000 2004-07-26
  • 打赏
  • 举报
回复
t = Split(pFile, vbCrLf)
=======================
应是:t = Split(pFile, ",")
dongge2000 2004-07-26
  • 打赏
  • 举报
回复
大概如下,再改改。
dim pFile as string
pfile="1,11,20,22,22,23,25,45,68,92,111,356"
Dim i As Long
Dim Lh As Long
Dim LL As Long
ui = 2000
While InStr(1, pFile, CStr(ui & ",")) = 0
ui = ui - 1
Wend
Dim t() As String
t = Split(pFile, vbCrLf)
Dim i As Long
For i = 0 To ui - 1
List1.AddItem t(i)'加上上面的回复。
Next
Alern 2004-07-26
  • 打赏
  • 举报
回复
穷举:

dongge2000 2004-07-26
  • 打赏
  • 举报
回复
按大小排序,一个一个的读,读2时就instr(i,str,cstr(45-i))
在i=2时
gzhiceberg 2004-07-26
  • 打赏
  • 举报
回复
穷举
yelang771 2004-07-26
  • 打赏
  • 举报
回复
如何显示所有输入的数字呢? 用文本框,还是下拉菜单的
cosio 2004-07-26
  • 打赏
  • 举报
回复
版面里很多相似的问题,你自己去找找了!
就是用树的遍历!
落伍者 2004-07-26
  • 打赏
  • 举报
回复
建议楼主多看看数据结构方面的书。尤其是背包问题。
另外多读读高手写的原代码,在此之前先把msdn的vb的例程看一遍。
yelang771 2004-07-26
  • 打赏
  • 举报
回复
在问一下:access 自带的vb 和安装的vb 有差别吗?
在access自带的vb里 和安装的vb里运行这个程序 有差别吗?

我没用过access自带的vb ,看起来那个也能用 ,好象挺麻烦的
yelang771 2004-07-26
  • 打赏
  • 举报
回复
回 :northwolves(狼行天下)

我看了。。那个问题是解决了

我比较菜。 现在看明白了 换成n就可以了

不过我每次计算时 多得这行代码吗?

Private Sub Command1_Click()
Dim S() As String
GETALL "1,11,20,22,22,23,25,45,68,92,111,356", 45, S '和为19 时
End Sub

我想在运行的界面里输入数字
就是输入一个数字 接着输下一个数字 ,直到输完


northwolves 2004-07-26
  • 打赏
  • 举报
回复
你发的帖子为什么不看?http://community.csdn.net/Expert/topic/3205/3205871.xml?temp=.1636621


Sub GETALL(ByVal yourstr As String, ByVal SUM As Integer, ByRef RESULT() As String)
Dim A(), I As Long, NUM As Integer, ALLNUM As Long, n As Integer
Dim TEMP1 As Long, TEMP2(1 To 20) As Integer, TEMP As Integer
Dim x() As String
x = Split(yourstr, ",")
n = UBound(x)
ALLNUM = 0
For I = 1 To 2 ^ n
TEMP1 = I
NUM = 0
For j = 1 To n '转换为二进制
TEMP2(j) = TEMP1 And 1 '0 or 1
TEMP1 = TEMP1 \ 2
If TEMP2(j) = 1 Then
NUM = NUM + 1
ReDim Preserve A(1 To NUM)
A(NUM) = x(j - 1)
End If
Next


TEMP = 0
For j = 1 To NUM
TEMP = TEMP + Val(A(j))
Next

If TEMP = SUM Then '满足条件

ALLNUM = ALLNUM + 1
ReDim Preserve RESULT(1 To ALLNUM)

RESULT(ALLNUM) = Join(A, "+") & "=" & SUM '结果保存
Debug.Print RESULT(ALLNUM)
End If
Next
Debug.Print ALLNUM & " 种方法"
MsgBox "OK"
End Sub

Private Sub Command1_Click()
Dim S() As String
GETALL "1,11,20,22,22,23,25,45,68,92,111,356", 45, S '和为19 时
End Sub
Chice 2004-07-26
  • 打赏
  • 举报
回复
上面的代码是一个数字可以用任意多次。

下面的代码是一个数字只能用一次,可能更符合你的要求吧。

还是那句话,看你的造化了,呵呵

Option Explicit

Dim result() As Long
Dim used() As Boolean
Dim idx As Long
Dim data As Variant

Private Sub Form_Load()
data = Array(1, 11, 20, 22, 22, 23, 25, 45, 68, 92, 111, 356)
ReDim result(UBound(data))
ReDim used(UBound(data))
GetIt 45
End Sub


Private Sub GetIt(ByVal x As Long)
Dim i As Long, cont As Boolean

If x = 0 Then
'目标达到,输出结果
Dim s As String
For i = 0 To idx - 1
s = s + "+" + Format(result(i))
Next
Debug.Print Mid(s, 2)
Else
'继续搜索
For i = LBound(data) To UBound(data)

cont = False '是否继续的标志

'如果没有超过目标...
If x - data(i) >= 0 And Not used(i) Then
If idx = 0 Then
cont = True
Else
If data(i) >= result(idx - 1) Then cont = True
End If

'判断cont,防止重复: 1+1+2 = 1+2+1
If cont Then
used(i) = True
result(idx) = data(i)
idx = idx + 1
GetIt x - data(i)
idx = idx - 1
used(i) = False
End If
End If
Next
End If
End Sub






结果:
1+22+22 '因为有两个22,所一有一次重复
1+22+22
20+25
22+23
22+23
45

Chice 2004-07-26
  • 打赏
  • 举报
回复
我写的程序,能否明白就看你的造化了。


Option Explicit

Dim result() As Long
Dim min() As Long
Dim idx As Long
Dim data As Variant

Private Sub Form_Load()
data = Array(1, 11, 20, 22, 22, 23, 25, 45, 68, 92, 111, 356)
ReDim result(45)
ReDim min(45)
GetIt 45
End Sub


Private Sub GetIt(ByVal x As Long)
Dim i As Long, cont As Boolean

If x = 0 Then
'目标达到,输出结果
Dim s As String
For i = 0 To idx - 1
s = s + "+" + Format(result(i))
Next
Debug.Print Mid(s, 2)
Else
'继续搜索
For i = LBound(data) To UBound(data)

cont = False '是否继续的标志

'如果没有超过目标...
If x - data(i) >= 0 Then
If idx = 0 Then
cont = True
Else
If data(i) >= result(idx - 1) Then cont = True
End If

'判断cont,防止重复: 1+1+2 = 1+2+1
If cont Then
result(idx) = data(i)
min(idx) = data(i)
idx = idx + 1
GetIt x - data(i)
idx = idx - 1
End If
End If
Next
End If
End Sub
jonahclinton 2004-07-26
  • 打赏
  • 举报
回复
其实我没看明白什么意思。有点菜了。

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧