Excel VBA 编程题
请高手帮忙,我要用VBA实现一个功能。比如有一行数值数据A1,B1,C1,D1,E1,F1,G1....(少于10个)另外有一个常量X。规则如下:1.任意几个连续数值和小...
请高手帮忙,
我要用VBA实现一个功能。比如有一行数值数据A1,B1,C1,D1,E1,F1,G1....(少于10个)
另外有一个常量X。规则如下:
1.任意几个连续数值和小于X,则作为一个组。
2.所有数值只能属于一个组。
2.找出组的数量最少的分割方法并归类到第二行。
举个例子。
A1= 30; B1 = 10;C1 = 30;D1 = 10;另外X=45.
那么分割方法有几种:AB,CD;或者A,BC,D;显然第一种分法比第二种少了一组,那么取第一种分割法,并在A2返回"A1"&"B1",B2返回"C1"&"D1"
每天追加10分。。。看看啥时候高手能冒个泡。
目前用四层循环结合excel穷举所有排列组合然后做判断,不知道有啥好算法。 展开
我要用VBA实现一个功能。比如有一行数值数据A1,B1,C1,D1,E1,F1,G1....(少于10个)
另外有一个常量X。规则如下:
1.任意几个连续数值和小于X,则作为一个组。
2.所有数值只能属于一个组。
2.找出组的数量最少的分割方法并归类到第二行。
举个例子。
A1= 30; B1 = 10;C1 = 30;D1 = 10;另外X=45.
那么分割方法有几种:AB,CD;或者A,BC,D;显然第一种分法比第二种少了一组,那么取第一种分割法,并在A2返回"A1"&"B1",B2返回"C1"&"D1"
每天追加10分。。。看看啥时候高手能冒个泡。
目前用四层循环结合excel穷举所有排列组合然后做判断,不知道有啥好算法。 展开
3个回答
展开全部
我用了两重循环,中友返带间的两个for---next是用来输出答案的.在Input box中输入你的常量X,第一行你说少于10个,所以好芦就只定义到A(10),如果要更多,你只要修改数组长度,当然,你也可以用自定世岩义数组,呵呵,随你喜欢.因为你说是连续数值,所以简单很多啦.源代码如下,你可以自己在第一行输入10个以内的数字试下,应该没问题的.
希望可以帮助,也希望有更好的算法:
Option Explicit
Public Sub Best_combination()
Dim X As Long, n As Integer, i As Long, tmp As Long, ans As String, By As Integer
Dim j As Integer, i_old As Integer
Sheets("sheet1").Select
Sheets("sheet1").Rows("2:2").Clear
X = InputBox("please specify the constant")
Sheets("sheet1").Cells(3, 1) = X
n = Sheets("sheet1").Range("a1").CurrentRegion.Columns.Count
Dim A(10) As Long
With Sheets("sheet1")
For i = 1 To n
A(i) = .Cells(1, i)
Next
tmp = 0: i = 0: By = 1: i_old = 1
Do
Do
i = i + 1
tmp = tmp + A(i)
Loop While tmp < X And i < 10
For j = i_old To i - 1
.Cells(2, By) = .Cells(2, By) & "A" & j & " "
Next
i_old = i
If i_old = n Then
By = By + 1
.Cells(2, By) = .Cells(2, By) & "A" & n & " "
End If
tmp = 0
By = By + 1
i = i - 1
Loop Until i_old >= n
End With
End Sub
希望可以帮助,也希望有更好的算法:
Option Explicit
Public Sub Best_combination()
Dim X As Long, n As Integer, i As Long, tmp As Long, ans As String, By As Integer
Dim j As Integer, i_old As Integer
Sheets("sheet1").Select
Sheets("sheet1").Rows("2:2").Clear
X = InputBox("please specify the constant")
Sheets("sheet1").Cells(3, 1) = X
n = Sheets("sheet1").Range("a1").CurrentRegion.Columns.Count
Dim A(10) As Long
With Sheets("sheet1")
For i = 1 To n
A(i) = .Cells(1, i)
Next
tmp = 0: i = 0: By = 1: i_old = 1
Do
Do
i = i + 1
tmp = tmp + A(i)
Loop While tmp < X And i < 10
For j = i_old To i - 1
.Cells(2, By) = .Cells(2, By) & "A" & j & " "
Next
i_old = i
If i_old = n Then
By = By + 1
.Cells(2, By) = .Cells(2, By) & "A" & n & " "
End If
tmp = 0
By = By + 1
i = i - 1
Loop Until i_old >= n
End With
End Sub
百事牛
2024-10-22 广告
2024-10-22 广告
百事牛是共享提供商,我们提供可靠有效的服务,适当合理的授权费有利于的继续更新优化。同样的事情,同样的方法,百事牛团队十年磨一剑,始终至聚焦在密码恢复领域,深耕于此,我们已研制出有别于其他公司的算法和运算模式, 百事牛的暴力模式加入了分布式点...
点击进入详情页
本回答由百事牛提供
展开全部
a2=a1
b2=IF(ISNUMBER(A2),IF(A2+B1<45,A2+B1,"X"),A1+B1),搭伍向右拖。
在轮枝滚此基腊余础上去编程。
b2=IF(ISNUMBER(A2),IF(A2+B1<45,A2+B1,"X"),A1+B1),搭伍向右拖。
在轮枝滚此基腊余础上去编程。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这么复杂的问题就给20分,算了算了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询