2013-01-14 43 views
2

我需要一些提示来找到一个算法,返回总和最接近或等于给定数字的5元素。查找总共最接近或等于给定数字的5个元素

这些元素的数字大于0,并且在尝试获取给定数字时每个元素只应使用1次。

比方说,我们得到了一个数组{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}和我们试图获得的数字21。它应该返回{2, 3, 4, 5, 7}

任何帮助,非常感谢!

+0

提示:您可以使用带记忆的递归来解决此问题。 – kasavbere

+2

从3-SUM开始(http://en.wikipedia.org/wiki/3SUM)并从那里前进,同时失去对线性时间算法的任何希望(如果有的话)。 – mmgp

+0

提供“21”可能的最大值是多少?在问题中可能存在负值? –

回答

1
ok n loops all begin with counts = 0 (in this case n = 5) 
all loops end at MainArraySize (in this case MainArraySize = 10) 

int RequiredSum = ValueOfRequiredSum; 
int CurrentSum = 0; 
int CurrentClosestSum = 0; 
int[] Finalindexesrequired = int[5]{0,0,0,0,0}; 

//U might want to add Duplicates 
duplicate_count ++; 
int[5][] FinalindexesRequiredDuplicates= new int[5][]; 


for(int loopcount1 = 0, loopcount1++, loopcount < MainArraySize-1) 
{ 
for(int loopcount2 = 0, loopcount2++, loopcount < MainArraySize-1) 
{.. 
.. 
.. 
for(int loopcount5 = 0, loopcount5++, loopcount < MainArraySize-1) 
{ 

------------------------------------- 
Now this is all inside the 5th loop 
//Process logic here 
//Looping for first time 
if(CurrentSum = 0) 
{Currentsum = MainArray[loopcount1] + MainArray[loopcount2] + .... + MainArray[loopcount5] 
CurrentClosestSum = CurrentSum 
FinalindexesRequired[0] = loopcount1; 
FinalindexesRequired[1] = loopcount2; 
.. 
.. 
FinalindexesRequired[4] = loopcount2; 
} 

Currentsum = MainArray[loopcount1] + MainArray[loopcount2] + .... + MainArray[loopcount5] 


if((RequiredSum - CurrentSum) < (RequiredSum - CurrentClosestSum)) 
{ 
//Am gonna change the indexes because the currentsum ITERATION is closer 
FinalindexesRequired[0] = loopcount1; 
FinalindexesRequired[1] = loopcount2; 
.. 
.. 
FinalindexesRequired[4] = loopcount2; 

//If u wanted the duplicates also, since u came to a fresher ITERATION 
Reset the duplicatecount to 0 and remove all duplicates because they aint valid anymore 
} 

//What u Might want to Add is this 
if((Requiredsum - CurrentSum) = (RequiredSum - CurrentCosestSum)) 
{ 
//Hey we got Duplicates 
duplicate_count ++; 
FinalindexesRequiredDuplicates[0][duplicate_count] = loopcount1; 
FinalindexesRequiredDuplicates[1][duplicate_count] = loopcount1; 
.. 
.. 
FinalindexesRequiredDuplicates[5][duplicate_count] = loopcount1; 
} 

} 



-------------------------------- End of 5th loop 
}}}}} 



//FINALLY AFTER EXITING I THINK U HAVE UR ANSWER IN 

MAINARRAY[FINALINDEXESREQUIRED[0]] 
MAINARRAY[FINALINDEXESREQUIRED[1]] 
MAINARRAY[FINALINDEXESREQUIRED[2]] 
MAINARRAY[FINALINDEXESREQUIRED[3]] 
MAINARRAY[FINALINDEXESREQUIRED[4]] 


//IN CASE OF DUPLICATES U HAVE UR ANSWER IN 
set 1: 
MAINARRAY[FINALINDEXESREQUIRED[0]] 
MAINARRAY[FINALINDEXESREQUIRED[1]] 
MAINARRAY[FINALINDEXESREQUIRED[2]] 
MAINARRAY[FINALINDEXESREQUIRED[3]] 
MAINARRAY[FINALINDEXESREQUIRED[4]] 

other sets: 
MAINARRAY[FinalindexesRequiredDuplicates[0][0...n]] 
MAINARRAY[FinalindexesRequiredDuplicates[1][0...n]] 
MAINARRAY[FinalindexesRequiredDuplicates[2][0...n]] 
MAINARRAY[FinalindexesRequiredDuplicates[3][0...n]] 
MAINARRAY[FinalindexesRequiredDuplicates[4][0...n]] 
+0

这个答案是不可读的。 – paddy

+0

嗯,我的意思是我只是想用一个快速解决方案来解决问题。这显然不是最好的解决方案,但这是肯定会起作用的...其他用户显然有更好的解决方案,更好使用Log的算法,但嘿理解,诅咒带走了一个美好的时光更多..介意你这只是一个快速修复! – user1974729

+0

这是N^5复杂度。 –

0

如果目标是21,为什么不能将其返回{2,3,4,5,7},而不是{2,3,4,5,6}? 很混乱...

如果我的理解是正确的,这个问题可以通过DP来解决。这与knap-sack问题非常相似。时间复杂度为O(n * S),其中n是数组的大小,S是您的目标。

+0

确实......已编辑 – Ticko

相关问题