이 질문은 Python으로 구현되었습니다. PHP 코드로 다시 작성하고 싶은데 요소의 반복되지 않는 조합에서 막히네요. 아이디어를 주세요~
즉, N개의 요소가 있고 A
+B
가 100일 수도 있고, 우리가 찾고 있는 것은 120
을 초과하지 않는 결과를 만족하는 최대 조합, 즉 A
+C
+D
191과 같습니다.
<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>
이 질문은 Python으로 구현되었습니다. PHP 코드로 다시 작성하고 싶은데 요소의 반복되지 않는 조합에서 막히네요. 아이디어를 주세요~
즉, N개의 요소가 있고 A
+B
가 100일 수도 있고, 우리가 찾고 있는 것은 120
을 초과하지 않는 결과를 만족하는 최대 조합, 즉 A
+C
+D
191과 같습니다.
<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>
알고리즘에 관한 질문이시죠?
<code>rets = list(itertools.combinations(loop, i))</code>
이 작업을 직접적으로 철저하게 수행하는 것은 확실히 적합하지 않습니다. 데이터 양이 많으면 필연적으로 실패합니다. 자세한 설명은
를 참조하세요.Knapsack 문제는 조합 최적화의 NP-완전 문제입니다. 문제는 다음과 같이 설명할 수 있습니다. 품목 세트가 주어지면 각 품목에는 고유한 무게와 가격이 있습니다. 제한된 총 무게 내에서 품목의 총 가격이 가장 높도록 어떻게 선택합니까? 문제의 이름은 주어진 배낭에 넣을 가장 적절한 품목을 선택하는 방법에서 비롯됩니다.
https://zh.wikipedia.org/wiki...
php에서 itertools의 기능을 원하시면 다음을 읽어보세요
https://github.com/alts/iter.php