簡體   English   中英

如何找到從多個列表中選擇大於或等於給定數字的數字的可能方法的數量?

[英]How to find number of possible ways to pick numbers greater than or equal to a given number from multiple lists?

我試圖從多個數組列表中選擇一個數字,並找到所有可能的方法來選擇這些數字,以使這些數字的總和大於給定的數字。 我只能想到蠻力實施。

例如,我有五個數組列表,例如

A = [2, 6, 7]

B = [6, 9]

C = [4]

D = [4, 7]

E = [8, 10, 15]

並且給定的數字是 40。然后從每個列表中選擇一個數字后,所有可能的方法都可以是

[7, 9, 4, 7, 15]
[6, 9, 4, 7, 15]

因此,這是選擇大於或等於 40 的數字的兩種可能方法。如果給定的數字很小,那么可能有很多解決方案。 那么我如何在沒有蠻力的情況下計算它們呢? 即使使用蠻力,我如何 devise Java 中的解決方案。

下面是我的實現。 它適用於小數字,但如果數字很大,那么它會給我運行時錯誤,因為程序運行時間過長。

public static void numberOfWays(List<Integer> A, List<Integer> B, List<Integer> C, List<Integer> D,
List<Integer> E, int k){
    long ways = 0;
    for(Integer a:A){
        for(Integer b:B){
            for(Integer c:C){
                for(Integer d:D){
                    for(Integer e:E){
                        int sum = a+b+c+d+e;
                        //System.out.println(a+" "+b+" "+c+" "+d+" "+e+" "+sum);
                        if(sum > k)
                            ways++;
                    }
                }
            }
        }
    }
    System.out.println(ways);
}

該列表最多可以包含 1000 個元素,元素的范圍可以從 1 到 1000。閾值 k 的范圍可以從 1 到 10^9。

一種方法是這樣。 必須至少有一個解決方案,您可以從每個數組中選擇一個數字並將它們相加以大於或等於另一個數字。

考慮到 arrays 可能具有任意順序的隨機數,首先使用這種排序 function 將它們按降序排列(最大數字在前,最小數字在后):

 Arrays.sort(<array name>, Collections.reverseOrder());

然后選擇數組中的第一個元素:

v = A[0]
w = B[0]
x = C[0]
y = D[0]
z = E[0]

然后你可以像這樣打印它們:v,w,x,y,z

現在您的 output 將是:

7,9,4,7,15

由於它占用了每個數組的最大數量,因此它必須等於或大於給定的數字,除非該數字大於所有這些組合的總和,在這種情況下這是不可能的。

編輯:我想我的問題錯了。 如果您想知道有多少種可能的解決方案,那就容易多了。

首先創建一個變量來存儲可能性

var total = 0

使用 rand function 得到一個隨機數。 在您的數組中說如下內容:

v=A[Math.random(0,A[].length)]

對所有 arrays 執行相同的操作,然后將它們相加

var sum = v+w+x+y+z

現在您有一個 if 語句來查看總和是否大於或等於給定的數字(假設該值存儲在變量“given”中)

if(sum >= given){
total+=1
}else{
<repeat the random function to restart the process and generate a new sum>
}

最后,您需要重復多次,因為如果有多個解決方案,代碼只會找到一個並給您一個錯誤的總數。

為了解決這個問題,創建一個 for 循環並將所有這些代碼放入其中:

//create a variable outside to store the total number of elements in all the arrays

var elements = A[].length + B[].length + C[].length + D[].length + E[].length

for(var i = 0; i <= elements; i++){
<The code is inside here, except for "total" as otherwise the value will keep resetting>
}

最終結果應如下所示:

var total = 0

var elements = A[].length + B[].length + C[].length + D[].length + E[].length

for(var i = 0; i <= elements; i++){
    v=A[Math.random(0,A[].length)]
    w=B[Math.random(0,B[].length)]
    x=C[Math.random(0,C[].length)]
    y=D[Math.random(0,D[].length)]
    z=E[Math.random(0,E[].length)]

    var sum = v+w+x+y+z

    if(sum >= given){
        total+=1
    }else{
        v=A[Math.random(0,A[].length)]
        w=B[Math.random(0,B[].length)]
        x=C[Math.random(0,C[].length)]
        y=D[Math.random(0,D[].length)]
        z=E[Math.random(0,E[].length)]
    }
}

最后,一旦整個周期結束,就打印總數,或者只是做

console.log(total)

這僅供參考,代碼可能不起作用,它可能有一堆錯誤,這只是我的第一次草稿嘗試。 我必須自己測試它,但我希望你能看到我來自哪里。 只需查看過程,進行自己的修改,這應該可以正常工作。

我沒有刪除我的答案的第一部分,即使它不是這個問題的答案,所以如果你在這部分也遇到問題,你 select 可能是最高的數字,它可能會幫助你

祝你好運!

我不是 java 程序員。但我認為這是一個邏輯問題。所以,我已經在 python 中為你解決了它。我很確定你可以將它轉換成 Z93F725A07423FE1C889F448B33D21F46

這是代碼:

x = input('Enter the number:')

a = [2, 6, 7]
b = [6, 9]
c = [4]
d = [4, 7]
e = [8, 10, 15]

i = 0
z = 0

final_list = []

while i <= int(x):
    try:
        i += a[z]
        final_list.append(a[z])
    except BaseException:
        pass
    try:

        i += b[z]

        final_list.append(b[z])
    except BaseException:
        pass
    try:

        i += c[z]
        final_list.append(c[z])
    except BaseException:
        pass

    try:

        i += d[z]
        final_list.append(d[z])
    except BaseException:
        pass

    try:

        i += e[z]
        final_list.append(e[z])
    except BaseException:
        pass

    z += 1


print(final_list)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM