全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 Excel
3021 3
2007-10-11


有题如下:

在3×3矩阵中,

            A1  A2  A3

B1       1     2     3

B2       4      5     6

83       7      8      9

现在要从每行中选取一个数相加,求最大值为多少。条件是后一个数所在的列不能与前面数所在列相同。

比如,第一行选取了A2=2,那么第二行就不能选A2这个列的数,只能选A1或者A3;如果选A1=4,那么

第三行就只能选A3=9了。

因此一个3×3矩阵有6种相加方式。要求这三个数相加值最大为多少。

请问在EXCEL  中如何编程解决?

多谢!

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2007-10-30 15:41:00

你的问题只是3*3矩阵。

为了你看清程序,我举个5*5的例子。

首先,建1个新文件,然后建程序如下:


Public resCol As Collection                '存放输出结果

Sub test()
Dim a(1 To 5) As String                 '待排列字符
Dim result(1 To 5) As String            '暂存结果
Dim i As Integer                        '循环变量

Set resCol = New Collection             '初始化结果集合

a(1) = "1"                              '初始化待排列字符
a(2) = "2"
a(3) = "3"
a(4) = "4"
a(5) = "5"


Insert result, a                        '排列

Sheets(1).Columns("A:A").ClearContents  '清理结果位置,准备输出结果

For i = 1 To resCol.Count               '将结果输出,因为在Excel中,所以输出到单元格
    Sheets(1).Cells(i, 1) = resCol(i)   '如果不是在Excel,可以输出到需要的地方
Next
End Sub

Sub test2()
Dim a() As String                       '待排列字符
Dim result() As String                  '暂存结果
Dim Total As Integer                    '总共多少个字符
Dim i As Integer                        '循环变量

Total = Sheets(2).Cells(1, 1)           '获取总共的字符数
If Total > 26 Then
    MsgBox "字符数太多,超出程序设计"
    Exit Sub
End If
Set resCol = New Collection             '初始化结果集合

ReDim a(1 To Total)                     '根据总字符数重新定义数组
ReDim result(1 To Total)

For i = 1 To Total
    a(i) = Chr(i + 64)                  '初始化待排列字符
Next i

Insert result, a                        '排列

Sheets(2).Columns("B:B").ClearContents  '清理结果位置,准备输出结果
For i = 1 To resCol.Count               '将结果输出,因为在Excel中,所以输出到单元格
    Sheets(2).Cells(i, 2) = resCol(i)   '如果不是在Excel,可以输出到需要的地方
Next
End Sub


Sub Insert(ByRef arr() As String, ByRef InsStr() As String)     'arr:排列结果 insstr:尚需进行排列的字符
Dim i As Integer                        '循环变量
Dim j As Integer                        '循环变量
Dim b() As String                       '排列一次后,剩下的字符
Dim temp As String                      '排列结果临时变量

   
j = UBound(InsStr)                      'j: 还有多少个字符需要排列
If j <> 1 Then                          '如果多于一个
    ReDim b(1 To j - 1)                 '初始化剩余字符
    For i = 1 To j - 1                  '除掉Insstr中第一个字符,其余的将进行下次排列
        b(i) = InsStr(i + 1)            '剩余字符保存起来进行下次排列
    Next
    j = UBound(arr)                     '排列结果共包含多少字符
    For i = 1 To j
        If arr(i) = "" Then             '如果排列结果尚未填满
            arr(i) = InsStr(1)          '在空位中填入第一个尚需进行排列的字符
            Insert arr, b               '剩下的字符进行到下一次递归过程!!!!!
            arr(i) = ""                 '清理刚才的填充结果
        End If
    Next
   
Else                                    '如果仅剩余了一个字符需要排列
    For j = 1 To UBound(arr)            '在排列结果中寻找仅剩余的一个空位
        If arr(j) = "" Then             '找到了
            arr(j) = InsStr(1)          '把剩余的一个字符填入
            temp = ""                   '初始化临时变量
            For i = 1 To UBound(arr)
                temp = temp & arr(i)    '整理排列结果
            Next
            resCol.Add temp             '整理的结果保存入排列结果集合
            arr(j) = ""                 '清理刚才的排列
            Exit Sub                    '退出过程
        End If
    Next
End If
End Sub

然后在sheet1下,运行宏test,就会在sheet1的A列产生12345的所有排列,共120种。
然后
在b1写公式“=mid(a1,1,1)”
在c1写公式“=mid(a1,2,1)”
在d1写公式“=mid(a1,3,1)”
在e1写公式“=mid(a1,4,1)”
在f1写公式“=mid(a1,5,1)”

然后将上述公式下拉120行,于是12345的所有排列就被分散写开了。

然后copy下sheet1,数值粘贴到sheet2,删除第1列。

把要处理的正方形矩阵写在sheet3,从a1单元格写起。


然后写个宏,如下:
Sub work()
Dim k!
Dim lie!
Dim jieguo!
Dim m!, n!


For k = 1 To 120
  jieguo = 0
 
  For lie = 1 To 5
 
    m = Sheet2.Cells(k, lie)
    n = Sheet3.Cells(lie, m)
    jieguo = jieguo + n
   
   Next lie
  
   Sheet2.Cells(k, 8) = jieguo
  
 Next k
 
 
End Sub

在sheet2下运行宏,就在第8列显出了结果。

你可以根据第8列排序,看看最大值与最大值所对应的元素选法。


实际上,如果你的正方形矩阵如果恰是如你所写那种排列,则各种选法的结果都相同。


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2007-10-30 17:35:00

   该问题是线性规划中的指派问题。

   可以直接用EXCEL的线性规划工具解决。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2007-10-30 17:45:00

讲EXCEL的线性规划工具,解决指派问题的书很多。

你在baidu中搜“指派问题,EXCEL”就可查到不少书名。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群