将61拆分为整数分区

时间:2016-02-29 04:12:13

标签: algorithm integer

在我正在做的程序中,我有一个名为a = [5, 6, 7]的向量,我必须使用此列表中的整数将整数61拆分为加法分区。所以一个例子就是

61 = 5 + 6 + 7 + 7 + 6 + 6 + 6 + 6 + 6 + 6

有很多方法可以解决这个问题。我必须以编程方式执行此操作。我发现的一种方法如下。我不知道这总是会给出结果。首先,我检查61是否可以被列表中的任何数字整除。如果是,那么我可以使用该数字来添加多次(即商)以获得61.在这种情况下,61是素数。所以这会失败。下一步是 取列表中的第一个数字(在我们的例子中为5)并从61中减去它并尝试查看答案是否可被列表中的任何成员整除。如果是,那么我们再次找到了添加的方法。在这种情况下,从61减去5得到56,它可以被7整除,我们的解决方案将是

61 = 5 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7

通过这种方式,我们继续列表,直到我们在减法后找到一些可被列表中的成员整除的答案。

现在给我的列表[5, 6, 7]是这样的,即存在一个整数分区,使得我们可以使用该整数分区从添加中获得61。因此,我们不必担心是否存在解决方案。所以我的方法看起来很粗糙。我想知道是否有一种有效的方法可以做到这一点 使用组合学中的一些算法。所以我的最终答案应该是一份清单 整数分区中的数字。所以一个可能的答案是

[5, 6, 7, 7, 6, 6, 6, 6, 6, 6]

感谢

2 个答案:

答案 0 :(得分:1)

61的通用根是7

接近61的7个中的多个将是8,因此减去61-7 * 8 =给出56,

同样,6个接近61的差距为7的差异将为9, 减去61-6 * 9 =给出54,然后结果%剩余两个从{5,7}得到满足应为零

获得中间总和并找到他们的通用根与位移相结合可以给出答案。

希望这会有所帮助。 !很高兴进一步帮助

答案 1 :(得分:0)

我想我在这里找到了一个粗略的逻辑。让我们说给定列表是[5, 6, 7],数字是61.我们需要找到加法列表,总数是61.一个这样的例子是

61 = 5 + 6 + 7 + 7 + 6 + 6 + 6 + 6 + 6 + 6

另一个是

  61 = 5 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7

我们的工作是将右侧的数字作为列表。所以一种可能的解决方案是

[5, 6, 7, 7, 6, 6, 6, 6, 6, 6]

我的算法如下。首先从61中减去所有列表成员。所以61 - 5 - 6 - 7 = 43.所以我们从列表中得到前三个成员,分别是5,6,7。现在剩下的是43.要获得其他成员,我们减去每个5,6,7从43,一次一个,看看答案是否可以被5,6,7中的任何一个整除。所以

43 - 5 = 38 -> not divisible by any [5, 6, 7]
43 - 6 = 37 -> not divisible by any [5, 6, 7]
43 - 7 = 36 -> divisible by 6 in [5, 6, 7]

和商是6,这意味着我们必须使用6个中的6个和7个,我们从43中减去最后一个。所以列表将是原始列表加上7和a 长度为6的6个列表。所以我找到的一个可能的解决方案是

[5, 6, 7, 7, 6, 6, 6, 6, 6, 6]

我们可以验证总和是61.我用R编程语言编写了一个程序。这是

get_me_list <- function(number, mylist){

  rest <- number - sum(mylist)


  flag = FALSE

  for(i in seq_along(mylist)){

    answer <- rest - mylist[i]

    for(j in seq_along(mylist)) {

      if( answer %% mylist[j] == 0){

        repeat_factor <- answer / mylist[j]
        number_to_repeat <- mylist[j]
        pivot <- mylist[i]
        flag = TRUE
        break
      } 

    }
    if(flag){
      break
    }
  }


  final_list <- c(mylist, pivot, rep(number_to_repeat, repeat_factor))

  final_list
}

所以get_me_list函数需要两个输入。 numbermy_list。就我而言number = 61my_list = [5, 6, 7]。在R中,向量写为 c(5, 6, 7)5:7,如果它的序列从5到7.那么我得到的输出是

 c(5, 6, 7, 7, 6, 6, 6, 6, 6, 6)

R中的向量。我尝试给出my_list的各种值,并将解决方案与我用笔和纸计算的手动解决方案进行了比较。我正在通过上面的代码得到正确答案。我不知道这种方法是否总是有效。我当然假设只使用number的成员可以得到等于my_list的总和。 请评论代码。

感谢