$Win = GUICreate('Окно', 550, 150, -1, -1)
$Label1 = GUICtrlCreateLabel('Введите числа через запятую', 8, 12, 95, 34, 0)
$Input1 = GUICtrlCreateInput('1589, 2546, 5432, 6859, 4516, 7852, 9853, 5422, 1749, 6588', 110, 12, 410, 24)
$Label2 = GUICtrlCreateLabel('Введите сумму чисел', 8, 52, 95, 34, 0)
$Input2 = GUICtrlCreateInput('32741', 110, 52, 90, 24, 0x2000)
$Button1 = GUICtrlCreateButton('Результат', 8, 92, 95, 24, 0)
$Input3 = GUICtrlCreateInput('', 110, 92, 410, 24)
GUISetState()
While 1
$msj = Guigetmsg()
Switch $msj
Case -3
Exit
Case $Button1
If GUICtrlRead($Input1) <> '' And StringInStr(GUICtrlRead($Input1), ',') > 0 And GUICtrlRead($Input2) <> '' Then
$string = _DelSum(GUICtrlRead($Input1), GUICtrlRead($Input2))
GUICtrlSetData($Input3, $string)
Else
MsgBox(48, 'Ошибка!', 'Введены неверные данные!')
EndIf
EndSwitch
WEnd
Func _DelSum($string, $sum1)
$Array = StringSplit($string, ',')
$string = ''
$sum2 = 0
While 2
$aR = _RandomUnique(1, $Array[0], $Array[0] - 1)
For $i = Ubound($aR) - 1 To 0 Step -1
$sum2 += $Array[$aR[$i]]
$string &= $Array[$aR[$i]] & ','
If $sum2 = $sum1 Then ExitLoop 2
Next
$string = ''
$sum2 = 0
WEnd
Return StringTrimRight($string, 1)
EndFunc ;==>_DelSum
Func _RandomUnique($Min = 0, $Max = 1, $Count = 1)
Local $i, $k, $ts, $te, $tmp, $tmpNew, $iStep = 0, $nRnd, $iStepErr = 0
$k = $Max - $Min + 1
If $Min >= $Max Then Return SetError(1, 0, '')
If $k < $Count Then Return SetError(2, 0, '')
If $Count = 1 Then
Local $aUnique[2] = [1, Random($Min, $Max, 1)]
Return $aUnique
EndIf
Local $aStr[$k]
For $i = 0 To $k - 1
$aStr[$i] = $i + $Min
Next
If $Count > $k / 2 Then
Local $iCountExp = $k - $Count
Assign('\', '', 1)
While $iStep < $iCountExp
$nRnd = Random(0, $k - 1, 1)
If IsDeclared($aStr[$nRnd] & '\') <> -1 Then
$iStep += 1
$aStr[$nRnd] = ''
Assign($aStr[$nRnd] & '\', '', 1)
Else
; v===================================v
$iStepErr += 1
If $iStepErr > $k / 4 Then
$d = 0
For $i = 0 To $k - 1
If $aStr[$i] Then
$aStr[$d] = $aStr[$i]
$d += 1
EndIf
Next
If $d > 0 Then
ReDim $aStr[$d]
$k = $d
$iStepErr = 0
Else
ExitLoop
EndIf
EndIf
; ^===================================^
EndIf
WEnd
$d = 0
Local $aUnique[$k]
For $i = 0 To $k - 1
If StringLen($aStr[$i]) Then
$d += 1
$aUnique[$d] = $aStr[$i]
EndIf
Next
ReDim $aUnique[$d + 1]
$aUnique[0] = $d
; swap
For $i = 1 To $aUnique[0]
$iR = Random($i, $aUnique[0], 1)
If $i = $iR Then ContinueLoop
If $iR = 0 Then $iR = $aUnique[0]
$aTmp = $aUnique[$i]
$aUnique[$i] = $aUnique[$iR]
$aUnique[$iR] = $aTmp
Next
Else
Local $aUnique[$Count + 1] = [$Count]
Assign('\', '', 1)
While $iStep < $Count
$nRnd = Random(0, $k - 1, 1)
If IsDeclared($aStr[$nRnd] & '\') <> -1 Then
$iStep += 1
$aUnique[$iStep] = $aStr[$nRnd]
$aStr[$nRnd] = ''
Assign($aStr[$nRnd] & '\', '', 1)
Else
; v===================================v
$iStepErr += 1
If $iStepErr > $k / 4 Then
$d = 0
For $i = 0 To $k - 1
If StringLen($aStr[$i]) Then
$aStr[$d] = $aStr[$i]
$d += 1
EndIf
Next
If $d > 0 Then
ReDim $aStr[$d]
$k = $d
$iStepErr = 0
Else
ExitLoop
EndIf
EndIf
; ^===================================^
EndIf
WEnd
EndIf
Return $aUnique
EndFunc ;==>_RandomUnique