【问题标题】:How to get the combinations of fixed number of elements and variable number of used elements (no repetitions)如何获得固定数量的元素和可变数量的已使用元素的组合(不重复)
【发布时间】:2016-01-29 09:39:45
【问题描述】:

如何在 Java 中编写一个递归方法来打印 3 个不同数字的组合以及所用数字的可变计数? (不应包括重复。)也就是说,该方法应适用于不同的组合长度。例如,使用数字 0、1、2 和组合中使用的两个数字,您应该有:0 0 - 0 1 - 0 2 - 1 1 - 1 2 - 2 2。

相同的数字,3个数字的组合是: 0 0 0 - 0 0 1 - 0 0 2 - 0 1 1 - 0 1 2 - (...), 等等。 我在其他类似的主题中检查了几种类型的递归方法,但我仍然无法彻底理解并编写自己的方法。

【问题讨论】:

  • 打开 IDE。创建 JAVA 项目。创建班级。实现你的方法。
  • 欢迎使用stackoverflow。请阅读提问指南。stackoverflow.com/help/asking

标签: java


【解决方案1】:

也许先尝试计算所有排列。然后继续计算组合。 wiki 上的图片很有启发性https://en.wikipedia.org/wiki/Combination

您也可以通过此代码尝试笔和纸:Combinations method return issue

【讨论】:

  • 感谢您的回答!我已经看到了建议的解决方案,但是,递归方法似乎更难实现。如果您有兴趣,请查看我的解决方案。我不知道在执行速度等方面是否可以,但它对我有用。
【解决方案2】:

我提出了一个基于 n 数字系统的计数的非递归解决方案。例如,对于以 3 为底的系统,添加的数字是 3 的幂。

应该注意的是,这会打印所有组合,具有重复元素的组合应稍后删除,这在我的情况下是需要的。例如,从 001、010、100 组合中,只应保留第一个,其中元素按升序排列。

public static void main(String[] args) {
    int t = 2;
    int r = 2;
    ArrayList<Integer> l = new ArrayList<Integer>();
    int tmp;
    for (int p = 0; p <= (int)(Math.pow((double)t, (double)r)) - 1; p++) {
        tmp = p;
        for (int q = r - 1; q >= 0; q--) {
            for (int s = t - 1; s >= 0; s--) {
                if (tmp >= s * (int) (Math.pow(t, q))) {
                    l.add(Integer.valueOf(s));
                    tmp = tmp - s * (int) (Math.pow(t, q));
                    break;
                }
            }
        }
    }
    for (int i = 0; i <= l.size() - 1; i++) {
        if (i % r != r - 1) {
            System.out.print(l.get(i) + "-");
        } else {
            System.out.println(l.get(i));
        }
    }
}

【讨论】:

    猜你喜欢
    • 2019-07-11
    • 2014-05-25
    • 2022-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    相关资源
    最近更新 更多