這個題呢已經用Python實現了,想改寫成PHP代碼,卡在了對元素不重複組合上,求給個思路~
B等於100,而求的是滿足結果不超過
120的最大組合,正好
A+
C+
。
<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"><code class="python"># -*- 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 <= 5000 and s > m:
# 求和值
m = s
# 组合的列表
m_list = ret
# 最大值
print(m)
# 求和的元素
print(m_list)
</code></pre><div class="contentsignin">登入後複製</div></div><div class="contentsignin">登入後複製</div></div>
回覆內容:
120
的最大組合,正好A+
C+
。
<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"><code class="python"># -*- 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 <= 5000 and s > m:
# 求和值
m = s
# 组合的列表
m_list = ret
# 最大值
print(m)
# 求和的元素
print(m_list)
</code></pre><div class="contentsignin">登入後複製</div></div><div class="contentsignin">登入後複製</div></div>
你這題是要考算法的吧
<code>rets = list(itertools.combinations(loop, i))</code>
直接這樣窮舉必然不適合啊,數據量大一點必然會掛, 這應該算是個背包的問題, 具體描述可以看
背包問題(Knapsack problem)是一種組合最佳化的NP完全問題。問題可以描述為:給定一組物品,每種物品都有自己的重量和價格,在限定的總重量內,我們如何選擇,才能使得物品的總價格最高。問題的名稱來自於如何選擇最合適的物品放置於給定背包中。
https://zh.wikipedia.org/wiki...
如果要php裡itertools的功能可以看這個
https://github.com/alts/iter.php