Помооооощ!

8 отговора 548 прегледа
#1

Помооооощ!

В произволна колона имам следното:
239.12
239.22
-0.02
956.86
241.64
242.67
-0.02
242.92
1,457.79
481.41
486.17
489.87
0.02
488.34
1,463.56
489.25
487.76
0.02
486.95
490.28
1,455.96
485.07
480.73
2,390.77
0.02

Кажете има ли начин да разбера сборът на кои точно числа е равен на 1,370.89? Ако ви се струва много лесно мога и да усложня задачата, като задам интервал плюс/минус да речем 0,10

То, не че не мога, ама има ли смисъл, като няма значение
Отговор
в отговор на f(x)dx #2

Re: Помооооощ!

има разбира се с елка.

Това ми напомня как днес търсих във 10 000 записа общ сбор 167.17 лв. но имаше критерии по който да ги търся, така че ми отне само около час.

Go Install Analysis Toolpack!
Отговор
в отговор на alexoff #3

Re: Помооооощ!

човече, не се бъзикай. все пак наближава Коледа, а не Първи април.
смили се над бедния, изтерзан, вечноборещ се с цифрите анализатор.

То, не че не мога, ама има ли смисъл, като няма значение
Отговор
в отговор на f(x)dx #4

Re: Помооооощ!

Хм, задачата няма един отговор, т.е. може да има няколко комбинации от числа, чиито сбор да е определено число. Следователно тр. да определиш критерии на които да отговарят числата, за да можеш от всички верни комбинации да извлечеш "най-вярната". Честно казано нямам идея какви могат да бъдат те.
Ти споменаваш за някакъв "интервал плюс/минус да речем 0,10", което не разбрах точно какво означава...може би защото не съм икономист ;)

А иначе всички възможни комбинации е възможно да се намерят, чрез един не много сложен макрос, който ще се опитва да събира всяко със всяко число, докато получи отговора :)

Отговор
в отговор на merany #5

Re: Помооооощ!

Това, че е възможно да има няколко отговора ми е ясно. Да стигнем до там.
Що се отнася до интервала, работата е следната: сумата, която трябва да получа е число, което взимам от другаде. И е напълно възможно поради закръгления да нямам числа, в колоната, които да дават точно тази сума. т.е. ако търся 11 222,45 лв. може да имам пет числа, чийто сбор е 11 222,47. За нуждите на анализа това ме устройва.
А може ли да дадеш някаква идея за въпросния макрос. много съм бос във VВА

То, не че не мога, ама има ли смисъл, като няма значение
Отговор
в отговор на f(x)dx #6

Re: Помооооощ!

Разбрах за интервала, но това не е критерия за който говорех.

А относно макроса, и аз не пиша на VBA, но поназнайвам основните алгоритми за работа с числа. Та мога да ти споделя само алгоритъма. Евентуално утре-вдругиден, ако ми се отвори малко свободно време мога да пробвам да напиша нещо, но не обещавам...

А иначе - имаш един масив от числа, събираш 2 от тях и проверяваш дали техния сбор не е е равен на търсения.
Ако не е - добавяш 3-то число и пак проверяваш...
.... и така циклично проверяваш всички числа, докато не получиш желания сбор.

Има много начини и за оптимизиране. Например да не събираш произволни числа, а да кажем числа, които са по-малки или равни на разликата ти в момента до търсения сбор......уф, малко сложно стана..

Или пък друга оптимизация може да бъде, ако търсиш от 1000 числа, кои 2-3 числа НЕ влизат в търсения сбор. Тогава събираш всичките 1000 числа, намираш им сбора, и след това намираш разликата между този сбор и онзи другия сбор. Така по-лесно ще намериш кои числа НЕ влизат в него, отколкото да търсиш кои влизат......

Има и други варианти.....

Отговор
в отговор на f(x)dx #7

Re: Помооооощ!

Sub Proba()
Dim RedA As Integer
Dim RedB As Integer
Dim Sm As String
Sm = InputBox("Enter the wanted sum")
For RedA = 1 To 1000
'for 1000 rows
For RedB = 1 To 1000
If ActiveSheet.Cells(RedA, 1).Value + ActiveSheet.Cells(RedB, 1).Value = Sm Then

ActiveSheet.Range("b1").Value = RedA
ActiveSheet.Range("b2").Value = RedB
Exit Sub
Else
End If
Next
Next

End Sub

Това работи като намира първите две числа които дават тази сума, при по добро желание мисля че можеш да го приспособиш малко за нуждите си(да търси три или повече числа, и ако има и други които да дават същия сбор да ти ги покаже).
Дано съм бил полезен.

не знам как е ама и така не е...
Отговор
в отговор на f(x)dx #8

Re: Помооооощ!

Ммм, сладка задачка за интервю
Както вече са ти казали, задачата е доста ресурсоемка (време) без допълнителни ограничителни условия.

Ето ти едно макросче, което то решава задачата в общия случай, но те предупреждавам, че ако го пускаш върху голям масив и първото решение е с повечко събираеми трябва да имаш нерви да чакаш (още повече, ако няма решение)

Dim Inx() As Integer
Dim InxCnt, ValCnt As Integer
Private Function GN(i As Integer) As Boolean
Dim Result As Boolean
Inx(i) = Inx(i) + 1
If Inx(i) > ValCnt - InxCnt + i Then
Result = i > 0
If Result Then
Result = GN(i - 1)
If Result Then
Inx(i) = Inx(i - 1) + 1
GN = Inx(i) < ValCnt
Else
GN = Result
End If
Else
GN = Result
End If
Else
GN = True
End If
End Function

Private Function NextInx() As Boolean
Dim Result As Boolean
If InxCnt = 0 Then
InxCnt = 1
Inx(0) = 0
NextInx = True
Else
Result = GN(InxCnt - 1)
If Not Result Then
If InxCnt = ValCnt Then
NextInx = False
Else
InxCnt = InxCnt + 1
For i = 0 To InxCnt - 1: Inx(i) = i: Next i
NextInx = True
End If
Else
NextInx = Result
End If
End If
End Function


Public Sub SearchSum()
Dim SearchValue, TmpValue As Double
Dim Eps As Double
ValCnt = Selection.Count
If ValCnt <= 1 Then
MsgBox "Няма избрана област"
End
End If
ReDim Inx(ValCnt - 1)
InxCnt = 0
SearchValue = InputBox("Търсена сума", , 0)
Eps = InputBox("Допустима грешка", , 0)
While NextInx()
TmpValue = 0
For i = 0 To InxCnt - 1
TmpValue = TmpValue + Selection(Inx(i) + 1)
Next i
If Abs(TmpValue - SearchValue) <= Eps Then
s = ""
For i = 0 To InxCnt - 1
s = s + ";$" & Chr(Asc("A") + Selection(Inx(i) + 1).Column - 1) & "$" & Selection(Inx(i) + 1).Row
Next i
s = "=SUM(" + Right(s, Len(s) - 1) + ")"
If InputBox("Сума:" + Str(TmpValue) + Chr(13) + "Грешка:" + Str(Abs(TmpValue - SearchValue)), "Продължава ?", s) = "" Then End
End If
Wend
End Sub

Маркираш областта в която да търси сумата, стартираш макроса SearchSum, задаваш търсената сума и допустимото отклонение и ... чакаш
Съветвам те да даваш по-големи стойности за допустимо отклонение за да не чакаш много, ако не си сигурен че сумата съществува.
Напр. за посочените от теб примерни стойности най-малкото отклонение е 64.27(1435.16=SUM($A$1;$A$2;$A$3;$A$4;$A$7)) - доста далеч от 0.1

Ако можеш да дадеш ограничение напр. за броя на събираемите или др., може доста да се оптимизира.

Отговор
в отговор на f(x)dx #9

Re: Помооооощ!

прбва ли с Goal seek.....

всъщност май Solver-a би трябвало да ти свърши работа, ако досега не си го сметнал, там можеш да му зададеш ограниченията, на които искаш да отговаря уравнението ти и то после ти показва от кои клетки е съставено то /тва го говоря по спомени, щото отдавна не съм го ползвал/

ако те интересува къде ти е Solver-a Алекс ше ти каже веднага - Go Install Anlysis Toolpack

поздрави, дано ти помогна

К.

........I WASN'T REALY DRUNK AT THE TIME.......

Редактирано от killin на

Отговор