本帖最后由 micch 于 2019-3-6 19:35 编辑
折腾一天才写出来,实在是不懂递归,应该能简化,应该有更好的办法,但是实在弄不好了。
- Dim ar, br, a, m%, n%, Z%, r%, X, Y, str
- Sub st()
- Z = 40
- m = 7 '正数表示和物品不同侧,负数表示同侧
- ar = Array(0, 1, -1, 3, -3, 9, -9, 27)
- ReDim br(1 To 40, 1 To 6)
- For n = 1 To 4
- ReDim a(n)
- Call zh(a, 1, m, n)
- Next
- With [a1].Resize(r, 6)
- .Value = br
- .Sort .Cells(1, 6), 1
- .HorizontalAlignment = xlLeft
- End With
- End Sub
- Function zh(a, k, m, n)
- For i = a(k - 1) + 1 To m - n + k
- a(k) = i
- If k = n Then
- X = "=0"
- For c = 1 To n
- If InStr(X, Abs(ar(a(c)))) = 0 Then X = X & "+" & ar(a(c))
- Next
- Y = Evaluate(X)
- If Y > 0 And Y <= Z And InStr(str & ",", "," & Y & ",") = 0 Then
- str = str & "," & Y
- r = r + 1
- br(r, 5) = " = "
- For c = 1 To UBound(Split(X, "+"))
- br(r, c) = Split(X, "+")(c)
- If Val(br(r, c)) < 0 Then
- br(r, 5) = Abs(br(r, c)) & " " & br(r, 5)
- Else
- br(r, 5) = br(r, 5) & " " & br(r, c)
- End If
- Next
- br(r, 5) = "物品 " & br(r, 5): br(r, 6) = Y
- End If
- Else
- Call zh(a, k + 1, m, n)
- End If
- Next
- End Function
复制代码
|