我被一個朋友問了一個編程問題,關於如何確定所有可能的組合值可以被添加到一個所需的總和。我有一個解決方案,但它不夠優雅(它基本上只是一系列for循環和if語句)。我相信dplyr有一個我無法想到的解決方案,因爲我知道它有多有用,但我還沒有很好的解決它。我將在下面發佈問題和我的腳本。確定所有可能的組合的值,總和爲所需的總數
問題: 有一個有六個環的目標,每個環都值不同的值。這些值是1,2,3,4,5或6.您可以使用多少種不同的戒指組合來得分爲9分?
所以要考慮: 順序並不重要 只要你想 您可以使用盡可能少或儘可能多的價值可以得到相同的值不止一次(所以9 1的是一個完全有效的選項)
我考慮過首先使用combinat包中的combn(),但combn()不會替換值。
然後我決定使用一系列嵌套for循環和if語句(我將它截斷爲只能使用最多6個值的地方,因爲雖然我可能有空閒時間,但我不是一個受虐狂的人編寫一個允許最多9個值的循環)。所以基本上,它通過6個for-loops值得可能的值。我包含數字0到可能值的列表中以表示沒有嘗試,因爲我只需要2個值而不是6個(因此4 + 5 + 0 + 0 + 0 + 0是此循環中的有效輸出,但不會能夠做4 + 5,因爲它總是會嘗試添加更多的非零值)。
## Create a vector x with possible values
x = c(1,2,3,4,5,6)
## Add in value 0 because I need to be able to write this dumb loop that allows many terms to be used, but also allows smaller amounts of terms to be used
x = c(x,0);x
## Creating empty data.frame to input solutions to so that I can check for uniqueness of solution
df = data.frame("a" = as.numeric(),
"b" = as.numeric(),
"c" = as.numeric(),
"d" = as.numeric(),
"e" = as.numeric(),
"f" = as.numeric())
for (a in x){
for (b in x){
for (c in x){
for (d in x){
for (e in x){
for (f in x){
m = sum(a,b,c,d,e,f)
if(m == 9) {
p = 0
n = c(a,b,c,d,e,f)
if (nrow(df) == 0){
df[1,] = n
}
if (nrow(df) >= 1){
for (i in (1:nrow(df))){
if(setequal(n,df[i,]) == TRUE){
p = p+1
}}
if(p == 0){
df = rbind(df,n)
}
}
}
}
}
}
}
}
}
## Convert any 0 values to NA
df[df==0] = NA
## Check Solutions
df
我創建了一個空data.frame存儲解決方案,然後在循環中,我創建了一個測試,看看在迴路中的新的解決方案以前發現的值的組合匹配,如果是這樣,它不會將()綁定到data.frame。
我相信有一個更好的方法來做到這一點,允許動態最大數量的值(所以在這種情況下可以軟編碼,以將每個解決方案中的最大值數量改爲9,而不是我的硬編碼6,或者如果我想要的總數是5而不是9,則將其降至5)。如果您有任何建議可以減少這種笨拙的循環填充,我們將不勝感激!
相關:[查找所有組合總和到目標的數字](https:// stackoverflow .COM /問題/ 30858688 /發現,所有組合-的號碼 - 那森對一個目標); [生成所有排列的N球在M箱](https://stackoverflow.com/questions/27064675/generating-all-permutations-of-n-balls-in-m-bins) – Henrik
E.g. '庫(分區)'; 'p < - 部分(9)'; 'p [,colSums(p> 6)== 0]'。 – Henrik
[所有可能的組合總和到目標值](https://stackoverflow.com/questions/32617501/all-possible-combinations-of-a-set-that-sum-to-a-target-價值) – Henrik