【问题标题】:Finding the maximum possible sum/product combination of integers找到最大可能的整数和/乘积组合
【发布时间】:2018-09-26 07:35:37
【问题描述】:

给定一个 N 个整数列表的输入,总是从 1 开始,例如:1、4、2、3、5。还有一些目标整数 T。

按顺序处理列表,算法决定是否将数字与当前分数相加或相乘,以达到最大可能输出

例如:[输入] 1, 4, 2, 3, 5 T=40

1 + 4 = 5
5 * 2 = 10
10 * 3 = 30
30 + 5 = 35 which is < 40, so valid.

但是

1 * 4 = 4
4 * 2 = 8
8 * 3 = 24
24 * 5 = 120 which is > 40, so invalid.

我无法在算法中对此进行概念化——我只是在寻找有关如何考虑它的建议或最多是伪代码。我将如何进行编码?

我的第一直觉是将 +/* 视为 1/0,然后测试排列,例如 0000(我认为长度 == N-1),然后是 0001,然后是 0011,然后是 0111,然后是 1111,然后是 1000,等等。

但是我不知道如何将它放入伪代码中,给定一个通用的 N 个整数。任何帮助将不胜感激。

【问题讨论】:

  • 修剪的“蛮力”方法就可以了。可以使用动态编程进行有效的实现
  • 看来你不知道如何用二进制打印从 0 到 2^N-1 的数字。
  • 整数是正数吗?没有此信息无法解决问题。
  • 标题误导。它应该像“寻找最接近的可能的正整数顺序和/积组合”
  • @Rerito 这里不需要应用动态规划。它是一棵二叉树。通常的 bracnh 和绑定 >= T 就足够了。

标签: algorithm


【解决方案1】:

您可以使用递归来实现排列。 Python代码如下:

MINIMUM = -2147483648
def solve(input, T, index, temp):
    # if negative value exists in input, remove below two lines
    if temp >= T:
        return MINIMUM
    if index == len(input):
        return temp

    ans0 = solve(input, T, index + 1, temp + input[index])
    ans1 = solve(input, T, index + 1, temp * input[index])
    return max(ans0, ans1)

print(solve([1, 4, 2, 3, 5], 40, 1, 1))

但是这种方法需要 O(2^n) 时间复杂度。

【讨论】:

    猜你喜欢
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 2016-02-14
    相关资源
    最近更新 更多