算法题——一道数字组合的题目的求解

简介:
题目:给定一个数字,和一个范围,产生所有在范围内的不重复的数字之和,和等于给定的数字。 
举例:给数字12,范围3-6。可以产生以下5个组合: 
1、3+3+3+3 
2、3+3+6 
3、3+4+5 
4、4+4+4 
5、6+6 
要求给出最快实现,并且是非递归。

  

  这是某人给我出的一道算法题。经过考虑,给出了解法。最快的谈不上(算法无止境、人外有人),没有用递归。

 

  还是以题目的例子说明,数字12,范围3-6。给出了5种组合。将这5种组合改写一下

    3+3+3+3=3*4+4*0+5*0+6*0  记作:(4,0,0,0)
3+3+6=3*2+4*0+5*0+6*1    记作:(2,0,0,1)
3+4+5=3*1+4*1+5*1+6*0    记作:(1,1,1,0)
4+4+4=3*0+4*3+5*0+6*0    记作:(0,0,3,0)
6+6=3*0+4*0+5*0+6*2     记作:(0,0,0,2)

  可以看出,本题就变成求各个数字的系数组合。求解这样的题目一般用递归(本题要求不能用递归)或者递推。

  在“遍历组合算法的模块化”中,介绍了解这类题的模块化代码。如下所示:

 

  Public Sub Traversal()
Dim P() As Integer, K As Integer, IsGroup As Boolean

    InitData()                        注:初始化数组代码块

    K = P.GetUpperBound(0)

    Do
If IsMatch()  Then                  注:判别是否满足条件的代码块
OutputAnswer()                  注:输出解的代码块
End If

      IsGroup = False

      Do
Delta(K)                     注:P(K)自增加值的代码块
Do
If Overflow(K) Then             注:判断P(K)是否越界的代码块
K = K - 1
Exit Do
Else
If K < P.GetUpperBound(0) Then
K = K + 1
SetP(K)                注:依据条件设置P(K)值的代码块
Else
IsGroup = True
Exit Do
End If

          End If
Loop
Loop Until (K < 0 Or IsGroup = True)

    Loop Until K < 0

    SomeEndCode()                      注:求解结束的代码块

  End Sub

 

  上面的代码相当于伪代码。还要根据本题的实际情况,进行改写。

  首先,函数有输入参数:A——给定的数字;N——范围的下限;M——范围的上限

  函数有返回值,以字符串数组返回每一组解

  1、初始化数组的代码:

    Dim i As Integer, j As Integer
Dim tS() As String = {}, T As Integer = -1
Dim S As Integer


For i = 0 To M - N - 1
P(i) = 0
Next
P(M - N) = Int(A / M)
S = P(M - N) * M

    最先想到的数组初始化的代码是所有的系数都是0,但是没有必要,最后的一个系数是和前面的系数相关的。

  2、判别是否满足条件的代码块:
这个简单,S=A

  3、输出解的代码块:

    ReDim Preserve tS(T + 1)
T += 1
tS(T) = ""
For i = 0 To M - N
If P(i) > 0 Then
For j = 1 To P(i)
tS(T) &= (i + N).ToString & "+"
Next
End If
Next
tS(T) = tS(T).Substring(0, tS(T).Length - 1)
4、P(K)自增加值的代码块:
P(K) += 1                   

    S += K + N

  5、判断P(K)是否越界的代码块
这个也很简单,S>A

  6、依据条件设置P(K)值的代码块
这个分两种情况,若P(K)不是最后一个系数,设置为0;是最后一个系数,设置为最大可能的组合。

    If K < P.GetUpperBound(0) Then
P(K) = 0
Else
P(K) = IIf(S > A, 0, Int((S - A) / M))
S += P(K) * M
End If

  7、求解结束的代码块

    把前面的解返回出去。

    Return tS

 

  至此,代码改写完毕。完整的代码如下:

  Public Function Traversal(ByVal A As IntegerByVal N As IntegerByVal M As IntegerAs String()
Dim K As Integer, IsGroup As Boolean
Dim P(M - N) As Integer
       

    Dim i As Integer, j As Integer
Dim tS() As String = {}, T As Integer = -1
Dim S As Integer


For i = 0 To M - N - 1
P(i) = 0
Next
P(M - N) = Int(A / M)
S = P(M - N) * M

 

    K = P.GetUpperBound(0)

    Do

      If S = A Then                         

        ReDim Preserve tS(T + 1)
T += 1
tS(T) = ""
For i = 0 To M - N
If P(i) > 0 Then
For j = 1 To P(i)
tS(T) &= (i + N).ToString & "+"
Next
End If
Next
tS(T) = tS(T).Substring(0, tS(T).Length - 1)
End If

          

      IsGroup = False

      Do
P(K) += 1                   
S += K + N
Do
If S > A Then           
S -= (K + N) * P(K)
K = K - 1

            Exit Do
Else
If K < P.GetUpperBound(0) Then
K = K + 1

              If K < P.GetUpperBound(0) Then
P(K) = 0
Else
P(K) = IIf(S > A, 0, Int((S - A) / M))
S += P(K) * M
End If
Else
IsGroup = True
Exit Do
End If

          End If
Loop
Loop Until (K < 0 Or IsGroup = True)

    Loop Until K < 0


Return tS

  End Function

 

    本文转自万仓一黍博客园博客,原文链接:http://www.cnblogs.com/grenet/archive/2011/03/31/2000549.html,如需转载请自行联系原作者


相关文章
|
30天前
|
存储 算法 JavaScript
怎么刷算法,leetcode上有哪些经典题目
怎么刷算法,leetcode上有哪些经典题目
15 0
|
1月前
|
算法
【算法】——动态规划题目讲解
【算法】——动态规划题目讲解
|
7月前
|
存储 算法 决策智能
(万字,细细阅读)竞赛算法入门必经算法模型(附带题目链接和模板)(下)
(万字,细细阅读)竞赛算法入门必经算法模型(附带题目链接和模板)(下)
48 0
|
7月前
|
算法 C++ 容器
(万字,细细阅读)竞赛算法入门必经算法模型(附带题目链接和模板)(上)
(万字,细细阅读)竞赛算法入门必经算法模型(附带题目链接和模板)(上)
27 0
|
7天前
|
算法
算法系列--动态规划--背包问题(4)--完全背包拓展题目(上)
算法系列--动态规划--背包问题(4)--完全背包拓展题目(上)
16 0
|
8月前
|
算法 Java
大厂算法题目-单链表删除数字
大厂算法题目-单链表删除数字
大厂算法题目-单链表删除数字
|
4月前
|
算法
class037 二叉树高频题目-下-不含树型dp【算法】
class037 二叉树高频题目-下-不含树型dp【算法】
22 0
class037 二叉树高频题目-下-不含树型dp【算法】
|
4月前
|
算法
class036 二叉树高频题目-上-不含树型dp【算法】
class036 二叉树高频题目-上-不含树型dp【算法】
29 0
|
4月前
|
算法
数据结构字符串匹配KMP算法的详解(题目讲解 简单易懂)
数据结构字符串匹配KMP算法的详解(题目讲解 简单易懂)
32 0
|
6月前
|
机器学习/深度学习 算法 Java
算法宝典2——Java版本(此系列持续更新,这篇文章目前3道)(有题目的跳转链接)(此份宝典包含了二叉树的算法题)
算法宝典2——Java版本(此系列持续更新,这篇文章目前3道)(有题目的跳转链接)(此份宝典包含了二叉树的算法题)