| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 395 人关注过本帖
标题:N个单元,每个单元可以取值1-M,要得出所有组合,请问如何实现?
只看楼主 加入收藏
exec2000
Rank: 1
等 级:新手上路
帖 子:2
专家分:5
注 册:2015-10-20
结帖率:0
收藏
已结贴  问题点数:20 回复次数:3 
N个单元,每个单元可以取值1-M,要得出所有组合,请问如何实现?
有N个单元,比如说3或5个。每个单元的取值可以分别是1到3,或是1到8之类。
比如说像这样
[1 2 ]
[1 2 3 ]
[1 2]

要从第一、二、三行中分别取一个值,组成一串数字。上述应该总共有12种组合,111,112,121,122,131,132,211,212,221,222,231,232
因为N与M都是不定的,无法用for循环实现,估计得用递归,但是一直想不明白到底要如何实现,请大神指点。
搜索更多相关主题的帖子: 如何 
2015-10-20 21:30
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:10 
这不是组合,这是穷尽。计数器法可穷尽出所有。

能编个毛线衣吗?
2015-10-20 22:00
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:10 
Option Explicit

Dim a() As Long             '所有的数据,二维数组
        
Dim n As Long               '第一维
Dim m() As Long             '第二维每行个数

Private Sub Command1_Click()

n = 3
ReDim m(n)

Dim maxm As Long
Dim i As Long, j As Long

Randomize

For i = 1 To n
    m(i) = Rnd() * 6 + 1
    If maxm < m(i) Then maxm = m(i)         '最大个数,确定数组第二维
Next i

ReDim a(n, maxm)


For i = 1 To n
    For j = 1 To m(i)
        a(i, j) = j
    Next j
Next i
 
Call DG("", 1, n, a(), m(1))

End Sub

Public Sub DG(前缀 As String, 层数 As Long, 总层数 As Long, 数据() As Long, 数据个数 As Long)

Dim i As Long
Dim s As String
If 层数 = 总层数 Then
    For i = 1 To 数据个数
        s = 前缀 & 数据(层数, i)
        Debug.Print s
    Next i
Else
    For i = 1 To 数据个数
        s = 前缀 & 数据(层数, i)
        Call DG(s, 层数 + 1, 总层数, a(), m(层数 + 1))
    Next i
End If
End Sub
--------------------------
有点属于递归。不知道数据再大一点会不会爆内存。

授人于鱼,不如授人于渔
早已停用QQ了
2015-10-21 09:22
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
给一个计数器法组合字符串的方法,在新工程里添加一个按钮,拷贝下列代码运行即看到效果

Private Function inc(s() As String, c() As Integer, l As Integer) As String
  '返回计数器指示的字符组合,同时计数器+1
  Dim i As Integer, a As String, j As Integer
  a = ""
  If c(0) < 0 Then Exit Function
  For i = 0 To l
    a = a & Mid(s(i), c(i) + 1, 1)
  Next
  j = 1
  For i = 0 To l
    c(i) = c(i) + j
    j = 0
    If c(i) + 1 > Len(s(i)) Then
      c(i) = 0
      j = 1
    End If
  Next
  If j = 1 Then c(0) = -1
  inc = a
End Function

Private Sub Command1_Click()
  Dim c(2) As Integer, s(2) As String, a As String, i
  s(0) = "AB": s(1) = "123": s(2) = "XY"
  c(0) = 0: c(1) = 0: c(2) = 0: a = "": i = 0
  While c(0) >= 0
    a = a & inc(s, c, 2) & ","
    i = i + 1
  Wend
  MsgBox a & i & "种组合"   
End Sub

能编个毛线衣吗?
2015-10-21 11:45
快速回复:N个单元,每个单元可以取值1-M,要得出所有组合,请问如何实现?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024520 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved