簡體   English   中英

益智游戲:如何按特定列的特定總和對行進行分組

[英]Puzzler: How To Group Rows By A Particular Sum of a Particular Column

如何將后面的行分成3組,其中“美元”的總和為10。必須使用所有行,且不得超過一次。

row|dollars
1|1
2|1
3|1
4|1
5|1
6|1
7|3
8|4
9|7
10|10

(可能的)預期結果之一是...

Row Group 1 = 10
Row Group 2 = 7,9
Row Group 3 = 1,2,3,4,5,6,8

額外積分:如果在數學上不可能每組都只得到10美元,那么是否有公式可以使我們與之最接近

我雖然也許是“ HAVING sum(dollar)= 10”,或者,對於一個緊密的解決方案,我只是將一行排序並分配給一組,但這並不能使我接近。

將“按特定列的總和分組行”等於“特定值” ,在某種意義上是這樣,但是,假設它們可能是數百萬行,則將存在性能問題。 我很沮喪

如果有幫助,我正在使用php和mysql。 僅使用sql的解決方案將是理想的選擇,但是某些組合也將是很好的選擇。 感謝您的任何建議。

編輯:如果我不清楚,我想返回使之成為可能的行,而不僅僅是“分組”。

我認為您不能僅使用sql就能做到,但肯定可以幫上忙。 我首先要進行如下查詢: select * from data where dollars <= 10 order by dollars desc ,然后在php中制作一個算法,遍歷結果並將其加起來,直到找到三個加起來等於10的集合。

它將開始從大到小相加,直到找到正確的總和,然后將其存儲,從列表中刪除這些項目,然后再次開始三次。 我正在用手機,但是當我使用計算機時,將通過一個有效的示例來更新答案。

編輯:到我的電腦。 這是非常混亂的代碼,但是它應該引導您正確的方向。

$dataset = [10,7,4,3,1,1,1,1,1,1];
$results = [];

function add_to_ten(&$data) {
    $sum = 0;
    $results = [];

    foreach ($data as $index => &$datum) {
        if ($datum == 0) {
            continue;
        }
        if ($sum + $datum <= 10) {
            $sum += $datum;
            $results[] = $index;
            $datum = 0;
        }
        if ($sum == 10) {
            return $results;
        }
    }
}

print_r(add_to_ten($dataset));
print_r(add_to_ten($dataset));
print_r(add_to_ten($dataset));

暫無
暫無

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

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