算法获得在Java中加起来为100的3个数字的所有可能组合

时间:2017-02-05 19:21:06

标签: java algorithm

每个数字应大于0。 订单并不重要。例如:值可以是25,50,25或25,25,50或50,25,25。 也许我们可以使用Random类并生成3个int值,每个值小于99且大于0,然后添加3个数字。如果加法等于100则打印3个数字。 有更好的方法,还是我应该使用上述方法?

编辑:我试图解决此问题:https://curiosity.com/topics/can-you-solve-the-cat-fish-bird-riddle-curiosity/

我计划得到3个加起来为100的数字,然后我会在另一种方法中使用这3个数字将第一个数字乘以10,第二个数字加3,最后一个数字加0.5。如果结果加起来那么我就找到了解决方案。对?

编辑2.1: 这是我提出的代码。它有效!

    // cat, fish, bird riddle

class RiddleOne {
    private float num, a, b, c, x, y, z;


    public void getBird() {
        for (x = 1; x <= 100; x++) {
            for (y = 1; y <= 100-x; y++) {
                z = 100 - x - y;

                if (checkQuantity()) {
                System.out.print("\n\tThe quantity of cat, fish and bird toys purchased are " +x +", " +y +" and " +z +" respectively.");
                System.out.print("\n\tThe total price of each toy is " +a +", " +b +" and " +c +" respectively.");
                num = a + b + c;
                System.out.print("\n\tThe total price is: " +num);
                break;
            }
            }
        }
    }

    public boolean checkQuantity() {
        a = 10 * x;
        b = 3 * y;
        c = z / 2;

        if (((a + b + c) == 100) && c != 0) 
            return true;

        return false;
    }

    public static void main(String[] args) {
        RiddleOne t = new RiddleOne();
        t.getBird();
    }
}

4 个答案:

答案 0 :(得分:3)

当顺序无关紧要时,要做的就是让你的算法以这样的方式运行:对于每个解决方案,它只能生成一定的顺序。这样你知道你没有重复。例如,我将查看排序顺序。 (这意味着&lt; = b&lt; = c)

您将从生成a开始,因为其他2必须高于或等于a,a必须低于100/3,否则b或c必须低于100/3。

然后我们知道b必须至少是a,它必须低于或等于100 - a - b,因此也低于或等于(100 - a)/ 2.

我们的算法将是这样的:

public void printAllCombinations() {
    for (int a = 1; a <= 100/3; a++) {
        for (int b = a; b <= (100 - a)/2; b++) {
            int c = 100 - a - b;
            // Report a, b and c
        }
    }
}

答案 1 :(得分:1)

暴力强制所有组合

每个数字介于1和100之间(好吧,98),因此您可以通过嵌套循环获得100 * 100 * 100 =百万个组合,跨越每个数字的所有可能值。或者您可以查看两个数字的所有组合,并要求第三个为100-a-b。由于顺序无关紧要,因此您需要一种过滤掉重复项的方法。

使用随机数不是一个好的解决方案,因为您无法保证所有可能的组合,即使您只是继续使用它足以获得所有有效组合的合理机会,你需要更多的尝试,而不仅仅是尝试每一次组合。

答案 2 :(得分:0)

你只需要循环两个数字;我们称他们为ij。由于这些数字需要总计为100,因此第三个数字k将立即知道:k = 100 - i - j

下面我写了一些代码来做到这一点:

public class Sum100 {

    public static void main(String argv[]) {

        for (int i = 0; i <= 100; i++) {
            for (int j = i; j <= 100-i; j++) {
                int k = 100 - i - j;
                System.out.printf("i=%3d, j=%3d, k=%3d\n", i, j, k);
            }
        }
    }
}

以下是所有输出中的几行:

i= 38, j= 59, k=  3
i= 38, j= 60, k=  2
i= 38, j= 61, k=  1
i= 38, j= 62, k=  0
i= 39, j= 39, k= 22
i= 39, j= 40, k= 21
i= 39, j= 41, k= 20

如您所见,代码可以为任何变量生成值0。尝试解决这个问题,以便更好地了解算法正在做什么。

跟进问题:

  1. 您能否仅仅通过查看代码循环来准确预测将打印多少行?

  2. 此算法的Big-O运行时间是多少?

答案 3 :(得分:0)

绝对不要使用随机性。

第一步是在循环中选择1到33之间的数字j。接下来,选择kj之间的(99-j)/2100-j-k。最后,确定第三个数字:<form role="search" method="get" id="searchform" class="searchform" action=""> <span class="fa fa-map-marker my-fa"></span> <input type="text" value="" name="s" id="search-input" class="s" placeholder="Enter your Postcode" autocomplete="off"> <img id="slider-loading" class="loading" src="https://www.imageupload.co.uk/images/2017/02/05/gps2.gif" /> <input type="hidden" value="profile" name="post_type" id="post_type" /> <input type="hidden" value="country" name="taxonomy" /> <input type="submit" id="searchsubmit" value="GO" class="submit btn" /> </form> 。这将按升序为您提供所有可能的三元组,其值按升序排列,并且比Peteris算法的时间更快。