首頁  >  文章  >  後端開發  >  給定一個陣列元素,將其元素求和,取出在某個區間中出現最大的值

給定一個陣列元素,將其元素求和,取出在某個區間中出現最大的值

WBOY
WBOY原創
2016-09-30 09:37:331189瀏覽

這個題呢已經用Python實現了,想改寫成PHP代碼,卡在了對元素不重複組合上,求給個思路~

B等於100,而求的是滿足結果不超過120的最大組合,正好A+C+ <pre class="brush:php;toolbar:false">&lt;code class=&quot;python&quot;&gt;# -*- coding=UTF-8 -*- import itertools loop = [509, 838, 924, 650, 604, 793, 564, 651, 697, 649, 747, 787, 701, 605, 644] m = 0 m_list = [] for i in range(0, len(loop)): # 目的是打乱其排序,找出任意种可能 rets = list(itertools.combinations(loop, i)) for ret in rets: # 将循环器中的元组求和 s = sum(ret) if s &lt;= 5000 and s &gt; m: # 求和值 m = s # 组合的列表 m_list = ret # 最大值 print(m) # 求和的元素 print(m_list) &lt;/code&gt;</pre> 回覆內容:

這個題呢已經用Python實現了,想改寫成PHP代碼,卡在了對元素不重複組合上,求給個思路~

B

等於100,而求的是滿足結果不超過

120

的最大組合,正好

A+C+ <pre class="brush:php;toolbar:false">&lt;code class=&quot;python&quot;&gt;# -*- coding=UTF-8 -*- import itertools loop = [509, 838, 924, 650, 604, 793, 564, 651, 697, 649, 747, 787, 701, 605, 644] m = 0 m_list = [] for i in range(0, len(loop)): # 目的是打乱其排序,找出任意种可能 rets = list(itertools.combinations(loop, i)) for ret in rets: # 将循环器中的元组求和 s = sum(ret) if s &lt;= 5000 and s &gt; m: # 求和值 m = s # 组合的列表 m_list = ret # 最大值 print(m) # 求和的元素 print(m_list) &lt;/code&gt;</pre> 你這題是要考算法的吧

<code>rets = list(itertools.combinations(loop, i))</code>
直接這樣窮舉必然不適合啊,數據量大一點必然會掛, 這應該算是個背包的問題, 具體描述可以看 背包問題(Knapsack problem)是一種組合最佳化的NP完全問題。問題可以描述為:給定一組物品,每種物品都有自己的重量和價格,在限定的總重量內,我們如何選擇,才能使得物品的總價格最高。問題的名稱來自於如何選擇最合適的物品放置於給定背包中。

https://zh.wikipedia.org/wiki...

如果要php裡itertools的功能可以看這個

https://github.com/alts/iter.php

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn