...来看看。怎么样将一堆数据中 使任意个数据之和等于定值
发布网友
发布时间:16小时前
我来回答
共1个回答
热心网友
时间:14小时前
是不是直接和这个差不多:
输入N个数字,输入其中几个数字的和A
需要输出所有和为A的数字的组合
例如:
输入 1,2,3,4,5,6,7,8
输入和 A=9
输出 (1,8),(2,7),(1,2,6)......
要列出所有可能组合,数字不能重复使用
但是如果输入的是3,3,3,3,3
输入和 A=9
输出 (3,3,3),(3,3,3)......
每个3都是不同的
做到不重不漏
刚巧做了个,用递归算法,留个邮箱,我可以把工程发给你
Dim number() As Integer '声明公共数组,本数组用来存储您输入的数
Dim cou As Integer '用来保存输入的数的个数
Dim sum As Integer '用来保存输入的数相加的和
Dim a, n As Integer 'a是您问题上的和A,n是我当前使用的临时数组的个数
Dim lsnumber() As Integer '用来保存正在进行相加的数
Private Sub Form_Load()
cou = 9 '初始化,用户输入了9个数,这个根据您的需要而定
sum = 0 '初始化,和为0
a = 9 '初始化,预计和为9
n = 0 '初始化,当前尚未使用任何lsnumber()数组的空间
ReDim number(cou - 1) As Integer '重定义数组长度,根据cou而定,数组下标从0到cou-1
ReDim lsnumber(cou - 1) As Integer '重定义数组长度,因为无法知道程序究竟用了多少个数相加 _
所以让这个数组的长度等于cou -1
For i = 0 To 8 'for循环用于给数组赋值,这个值您可以自己输入,我为了测试方便,就直接赋值了
number(i) = i + 1
Next
Text1.Text = Text1.Text & "层数 上次的和 这次加的数 和" & vbCrLf
Call searchnum(0) '重点,调用递归函数求解,传递值0给函数使用
End Sub
Function searchnum(ByVal num) '递归函数入口,没用过几次递归,所以就用我习惯的写法写了 _
不会用高手们的写法写
For i = num To cou - 1 '遍历number()数组中的每一个元素,下标从num开始
Text1.Text = Text1.Text & num & " " & sum & "+" '将当前操作的初始数组下标和上次运行得到的值输出到文本框中
sum = sum + number(i) '和累加
lsnumber(n) = number(i) '记录当前用来相加的数
Text1.Text = Text1.Text & number(i) & "=" & sum & vbCrLf '将当前相加的数和得到的结果输出到文本框中
If sum < a Then '如果当前的值小于我输入的和,再次调用这个递归函数
n = n + 1 '用来相加的数的个数加1
searchnum i + 1 '这儿调用自己本身传过去的值时i+1
ElseIf sum = a Then '如果这个和刚好是我输入的和,那么将它输出
pr n '输出这几个数,参见下面的模块
sum = sum - number(i)
'不排除剩下的没被检查过的数中还有和number(i)相等的数,所以继续循环
Else
sum = sum - number(i) '获得上次调用本程序后sum的值
End If
Next
'if语句用文字无法表述清楚,举个例子吧
'假设我有1,2,3三个数,输入的和为4 _
会出现这些算式:1+2+3=6 不满足 _
1+3=4 满足 _
2+3=5 不满足 _
这个程序就是计算了这些算式,每次计算加到3后就跳出这次调用,继续上次调用
If num > 0 Then
sum = sum - number(num - 1) '当这个递归函数要结束时,sum的值应该是上上次调用自身后的值,如果 _
num<=0,数组下标会越界
n = n - 1 '用来相加的数的个数应该减1
End If
End Function
Private Sub pr(ByVal leng) '输出保存在lsnumber()数组中的数
Text1.Text = Text1.Text & "满足要求的数:"
For i = 0 To leng
Text1.Text = Text1.Text & lsnumber(i) & " "
Next
Text1.Text = Text1.Text & vbCrLf
End Sub