【问题标题】:Get all possible combination from a value [closed]从一个值中获取所有可能的组合[关闭]
【发布时间】:2019-12-11 15:24:30
【问题描述】:

我怎样才能计算出某些 4 个数字的总和来得出某个结果,例如 280。 从 1 到 80 的所有可能的数字组合。显示具有我在文本框中设置的总和的 4 个数字的所有组合。我应该找出最简单的方法来做到这一点,如果你能帮助我,我将不胜感激。实例中不应有重复,如 60 60、80 80。从而消除不重要的变体,而重要的变体将保留。

Textbox1.Text

68,69,70,72 = 280
67,69,70,74 = 280
66,69,70,75 = 280 
65,69,70,76 = 280
64,69,70,77 = 280

等等……

我需要一个模型,我怎么能想到这样的算法?非常感谢。

获取声明某个数字总和的所有组合

【问题讨论】:

  • 将 4 分成 2 份,例如 AB。现在,进一步将A 分为A1A2B 分为B1B2。所以,答案是A1 + A2 + B1 + B2 = Number
  • 280/4 = 70,所以我们需要 4 个平均为 70 的数字,现在以 70-i、70+i、70-j、70+j 开头(i 和 j 不一样) .因为你限制了 80,所以 i 或 j 应该在 10 以内。
  • @ManojBanik - 您建议的计算不会创建所有可能的组合。例如,OP 的所有五个样本都不会包含在您的计算中。
  • 68-69-70-72 = 280??我只是想给一些提示,现在你可以提出这个想法来实现你的目标。
  • 其他一些组合,如 70、70-i、70-2*i、70+3*i

标签: vb.net algorithm


【解决方案1】:

这样的数字可能非常多。因此,我将首先获得一个描述它的简洁数据结构,然后运行在每个数据结构上执行的代码。

因为我没有 vb.net,所以我会用 Python 来做。希望翻译不要太难。我使用了闭包和字典。我没有使用自然的 Pythonic 迭代器。

#! /usr/bin/env python3

def find_combs_data (count, target, upper):
    # First we create a cache of known answers.
    cached = {}

    def find_combs (count_left, target_left, lower):
        cache_key = (count_left, target_left, lower)
        # Only do the calculation when needed.
        if cache_key not in cached:
            # Base case and sanity check.
            if count_left == 0:
                if target_left == 0:
                    return []
                else:
                    return None
            elif upper * count_left < target_left:
                return None
            elif target_left < lower * count_left:
                return None

            answer = {}
            for i in range(lower, upper + 1):
                result = find_combs(count_left - 1, target_left - i, i + 1)
                if result is not None:
                    answer[i] = result
            if len(answer):
                cached[cache_key] = answer
            else:
                cached[cache_key] = None

        return cached[cache_key]

    final = find_combs(count, target, 1)
    return final

def execute_on_combs (fn, count, target, upper):
    passed = []
    def execute_on_data (d):
        if d == []:
            fn(passed)
        else:
            for i, d_inner in d.iteritems():
                passed.append(i)
                execute_on_data(d_inner)
                passed.pop()
    execute_on_data(find_combs_data(count, target, upper))

def show (x):
    print(x)

execute_on_combs(show, 4, 270, 80)

【讨论】:

  • 这很有帮助,对于这个算法,谢谢,我会尝试在 VB.Net 中实现,如果我申请成功,我会回来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
相关资源
最近更新 更多