숫자 목록 (예 : [-1, 1, -4, 5]
)을 가지고 있으며 목록의 총계를 변경하지 않고 목록에서 번호를 제거해야합니다. 예를 들어 총계를 변경하지 않고 가능한 가장 큰 절대 값을 가진 숫자를 제거하려면 [-1, -4, 5]
은 [1]
을 남겨두고 합계가 변경되지 않도록합니다.총계를 변경하지 않고 목록에서 번호를 제거하십시오.
나는 총 값을 변경하지 않고 가능한 가장 큰 절대 값을 제거하는 모든 가능한 조합을 찾는 순진 접근법을 작성했습니다. 그러나 실제 목록이 그보다 훨씬 커질 것이기 때문에 그것은 정말로 느립니다. 그것은 corectly (-1, -4, 5)
인쇄
from itertools import chain, combinations
def remove(items):
all_comb = chain.from_iterable(combinations(items, n+1)
for n in xrange(len(items)))
biggest = None
biggest_sum = 0
for comb in all_comb:
if sum(comb) != 0:
continue # this comb would change total, skip
abs_sum = sum(abs(item) for item in comb)
if abs_sum > biggest_sum:
biggest = comb
biggest_sum = abs_sum
return biggest
print remove([-1, 1, -4, 5])
:
여기 내 조합 코드입니다. 그러나 모든 가능한 항목 조합을 반복하는 것보다 영리하고 효율적인 솔루션을 찾고 있습니다.
아이디어가 있으십니까? 당신은 누구의 합이 완전한 세트의 값과 동일한 하위 집합을 찾는 등의 문제를 다시 정의 할 경우
, 그것은 승리의 우리가 관찰하는 경우
다음은 R에
lpSolve
패키지를 사용하여 구현입니다 sum은이 목록의 항목입니다. 우리가'sum (items)'과'abs_sum (items)'을 가지고 있다면리스트에서 1, 2, 3, etc 요소를 사용하여 합계를 더하는 것이 효율적일 것입니다. – u0b34a0f6ae'most_sum' 대신'smallest_abs_sum'을 저장해야합니다. 다음을 고려하십시오 :'[1, -1,100, -100]. – jfs
@ J.F. 세바스찬 : 만약 입력이'[1, -1,100, -100]이라면'202'의'abs_sum'을 모두 지워야합니다. – nosklo