Algorithm 生成和算法

Algorithm 生成和算法,algorithm,loops,math,sum,Algorithm,Loops,Math,Sum,我必须为算法建立一个代码。我必须用我的算法实现以下目标: 我有三个数字,4,6,8。我必须用其中两个数字生成和,然后用其中三个数字生成和,然后用四个数字生成和,以此类推。当然,在这个例子中也可以有类似的副本:4+4+6 我有了使用“for”循环的想法,所以其中两个数字的和可以通过两个嵌套的for循环生成。三个嵌套的“for”循环将给出三个数字的和等 我可以通过使用“for”来约束这个解决方案,例如直到五个数字的总和,但这不是一个通用的解决方案 有什么方法、算法或数学方法可以做到这一点吗 数学组合

我必须为算法建立一个代码。我必须用我的算法实现以下目标:

我有三个数字,4,6,8。我必须用其中两个数字生成和,然后用其中三个数字生成和,然后用四个数字生成和,以此类推。当然,在这个例子中也可以有类似的副本:4+4+6

我有了使用“for”循环的想法,所以其中两个数字的和可以通过两个嵌套的for循环生成。三个嵌套的“for”循环将给出三个数字的和等

我可以通过使用“for”来约束这个解决方案,例如直到五个数字的总和,但这不是一个通用的解决方案

有什么方法、算法或数学方法可以做到这一点吗


数学组合学有一个相似之处。

你可以从一个数学公式推导出你的解

不同之处在于,在您的情况下,您可以有重复项,并且似乎有一个子集的最大大小


internet上提供了许多实施方案。

您可以从一个应用程序派生您的解决方案

不同之处在于,在您的情况下,您可以有重复项,并且似乎有一个子集的最大大小


internet上提供了许多实施方案。

您可以从一个应用程序派生您的解决方案

不同之处在于,在您的情况下,您可以有重复项,并且似乎有一个子集的最大大小


internet上提供了许多实施方案。

您可以从一个应用程序派生您的解决方案

不同之处在于,在您的情况下,您可以有重复项,并且似乎有一个子集的最大大小

internet上有很多实现。

这是的一种变体,假设您的元素都是小整数,则可以在伪多项式时间内使用动态规划有效地求解

f(0,i) = true
f(x,i) = false   if n < 0
f(x,i) = f(x,i-1) OR f(x-arr[i],i-1)
这个答案假设子集的大小没有限制-如果有,可以通过向表中添加另一个维度来完成

运行时是O(sum(arr)*n)

这是的一种变化,假设您的元素都是小整数,可以在伪多项式时间内使用动态规划有效地求解

f(0,i) = true
f(x,i) = false   if n < 0
f(x,i) = f(x,i-1) OR f(x-arr[i],i-1)
这个答案假设子集的大小没有限制-如果有,可以通过向表中添加另一个维度来完成

运行时是O(sum(arr)*n)

这是的一种变化,假设您的元素都是小整数,可以在伪多项式时间内使用动态规划有效地求解

f(0,i) = true
f(x,i) = false   if n < 0
f(x,i) = f(x,i-1) OR f(x-arr[i],i-1)
这个答案假设子集的大小没有限制-如果有,可以通过向表中添加另一个维度来完成

运行时是O(sum(arr)*n)

这是的一种变化,假设您的元素都是小整数,可以在伪多项式时间内使用动态规划有效地求解

f(0,i) = true
f(x,i) = false   if n < 0
f(x,i) = f(x,i-1) OR f(x-arr[i],i-1)
这个答案假设子集的大小没有限制-如果有,可以通过向表中添加另一个维度来完成


运行时间是O(总和(arr)*n)

对于任何给定数量的术语,您只需要两个循环。假设您想要n个值的总和。对于任何给定的和,都有n8乘以8,n6乘以6,n4乘以4,其中n8+n6+n4=n。要生成所有可能的组合,您只需要在n8和n6上循环,n4的值可以从中计算出来。在Python中:

def findsums(n):
    # n8 = [0..n]
    for n8 in range(n+1):
        #n6 = [0..n-n8]
        for n6 in range(n+1-n8):
            n4 = n - n8 - n6 
            # build the string consisting of n terms
            s = "+8" * n8 + "+6" * n6 + "+4" * n4
            # print, and strip the first '+' character
            print( "{0}={1}".format( s[1:], 8*n8+6*n6+4*n4 ) )

findsums(5)

对于任何给定数量的术语,您只需要两个循环。假设您想要n个值的总和。对于任何给定的和,都有n8乘以8,n6乘以6,n4乘以4,其中n8+n6+n4=n。要生成所有可能的组合,您只需要在n8和n6上循环,n4的值可以从中计算出来。在Python中:

def findsums(n):
    # n8 = [0..n]
    for n8 in range(n+1):
        #n6 = [0..n-n8]
        for n6 in range(n+1-n8):
            n4 = n - n8 - n6 
            # build the string consisting of n terms
            s = "+8" * n8 + "+6" * n6 + "+4" * n4
            # print, and strip the first '+' character
            print( "{0}={1}".format( s[1:], 8*n8+6*n6+4*n4 ) )

findsums(5)

对于任何给定数量的术语,您只需要两个循环。假设您想要n个值的总和。对于任何给定的和,都有n8乘以8,n6乘以6,n4乘以4,其中n8+n6+n4=n。要生成所有可能的组合,您只需要在n8和n6上循环,n4的值可以从中计算出来。在Python中:

def findsums(n):
    # n8 = [0..n]
    for n8 in range(n+1):
        #n6 = [0..n-n8]
        for n6 in range(n+1-n8):
            n4 = n - n8 - n6 
            # build the string consisting of n terms
            s = "+8" * n8 + "+6" * n6 + "+4" * n4
            # print, and strip the first '+' character
            print( "{0}={1}".format( s[1:], 8*n8+6*n6+4*n4 ) )

findsums(5)

对于任何给定数量的术语,您只需要两个循环。假设您想要n个值的总和。对于任何给定的和,都有n8乘以8,n6乘以6,n4乘以4,其中n8+n6+n4=n。要生成所有可能的组合,您只需要在n8和n6上循环,n4的值可以从中计算出来。在Python中:

def findsums(n):
    # n8 = [0..n]
    for n8 in range(n+1):
        #n6 = [0..n-n8]
        for n6 in range(n+1-n8):
            n4 = n - n8 - n6 
            # build the string consisting of n terms
            s = "+8" * n8 + "+6" * n6 + "+4" * n4
            # print, and strip the first '+' character
            print( "{0}={1}".format( s[1:], 8*n8+6*n6+4*n4 ) )

findsums(5)


是的,您可以使用递归。将示例输入包含在完整的预期输出中可能也很有帮助,这样您就可以100%清楚地了解您要做的事情。如果您考虑到x+x+x+…+x(n次)=x*n,您可能能够避免递归并提高性能。@n.m.要避免递归,您需要做的远不止这些,因为它不能解决5+3=4+4的问题。为了跟进我之前的评论(要求提供预期的输出,但仍应提供),您是否希望实际生成所有的总和,即4、6、8、4+4、4+6、4+8、6+6、6+8、8+8等。?如果是这样的话,你是想要唯一的和,所有的和,还是想要输出组成和的实际数字?(也就是说,4+8=6+6,那么您想打印“4+8”和“6+6”,还是一次打印“12”,或两次打印“12”?)当然有重复的总和。我计划删除重复的金额,只保留不同的金额。但这是这一过程的第二步。我想,生成所有可用的总和,将它们放入数组中,然后删除重复项。更简单。是的,你可以使用递归。将示例输入包含在完整的预期输出中可能也很有帮助,这样您就可以100%清楚地了解您要做的事情。如果您考虑到x+x+x+…+x(n次)=x*n,您可能能够避免递归并提高性能。@n.m.要避免递归,您需要做的远不止这些,因为它不能解决5+3=4+4的问题。为了跟进我之前的评论(要求提供预期的输出,但仍应提供),您想实际生成所有