javascript - 給定一個值,如100,給定一個數組,從數組中挑選出N個元素,這N個元素相加也是100,得到一種結果就行

來源:互聯網
上載者:User
如數組:

var arr = [99.1, 92.2, 60, 50,           49.5, 45.7, 25.1, 20,            17.4, 13, 10, 7, 2.1, 2, 1];

找到和為100的數組元素:

[60,20,10,7,2,1]

回複內容:

如數組:

var arr = [99.1, 92.2, 60, 50,           49.5, 45.7, 25.1, 20,            17.4, 13, 10, 7, 2.1, 2, 1];

找到和為100的數組元素:

[60,20,10,7,2,1]

function f($n, $arr) { //$n是目標數字,$arr是數字組成的數組    if (empty($arr)) return false; //如果數組沒有元素,返回    if (in_array($n, $arr)) return [$n];//如果期望的值已經存在,直接返回這個值    foreach($arr as $k => $v) { //遍曆數組        if ($v > $n) continue; //比指定數還大,過        $copy = $arr; //複製數組        unset($copy[$k]); //去掉複製數組中已經被選中的數字        $next = f($n - $v, $copy); //遞迴計算        if(! empty($next)) return array_merge([$v], $next); //合并結果集    }    return false;//沒找到啊}$arr = [99.1, 92.2, 60, 50, 49.5, 45.7, 25.1, 20, 7.4, 13, 10, 7, 2.1, 2, 1];$data = f(100, $arr);print_r($data);//Array ( [0] => 60 [1] => 20 [2] => 13 [3] => 7 ) $data = f(105, $arr);print_r($data);//Array ( [0] => 60 [1] => 20 [2] => 13 [3] => 10 [4] => 2 ) 

來個 Python 版的:

def subsetsum(elements, target):    if target==0:        return True, []    elif not elements or target < 0:        return False, None    result, subset = subsetsum(elements[:-1], target-elements[-1])    return (True, subset + [elements[-1]]) if result else subsetsum(elements[:-1], target)

思路很簡單,當我要問 elements 是否能加出 target 時,只有兩種可能:

  1. 我要使用 element[-1] 才能加出 target -> 我要能夠使用 elements[:-1] 加出 target-elements[-1] 才行

  2. 我不需要使用 element[-1] 就能加出 target -> 我要能夠使用 elements[:-1] 加出 target 才行

boundary condition 是:

  1. target0 時,代表我什麼都不用就能加出來,所以 return True, []

  2. elements 為空或是 target 為負值時,代表永遠都加不出來了,所以 return False, None

測試:

elements = [99.1, 92.2, 60, 50, 49.5, 45.7, 25.1, 20, 17.4, 13, 10, 7, 2.1, 2, 1]target = 100result, subset = subsetsum(elements, target)print(result, subset)

結果:

True [60, 20, 10, 7, 2, 1]

題外話,看到這個題目覺得超熟悉,如果還要考慮到解的速度等等會更有趣。

曾經做過這方面的研究,我提出一個變形的問題,大家可以思考看看:

我們今天給定一個整數(代表負數也 ok )的 多重集 (多重集就是一個集合,但是允許元素重複出現),叫做 elements,在給定另外一個整數的 多重集 叫做 targets,試問是否存在若干個 子多重集,每個 子多重集 的元素和恰好有一個在 targets 中對應的 target。

定義看不懂沒差,我舉個例子:

elements = (1,4,6,4,1)targets = (5,10,1)

這個例子是有解的:

(1,4) -> 5(4,6) -> 10(1) -> 1

注意,每個在 elements 中的元素只能被使用一次!

組合問題。看一下leetcode的原題:

function t100(array){  var tempArray = array.concat([]).sort(function(a,b){    return a-b;  });  var temp = 0;  var result = [];  for(var i=0;i100){      tempArray.length = i;    }  }  for(var i=0;i

遞迴內套一個迴圈

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.