Что нового

генератор заполнения ячеек

yuran2

Хочу все уметь
Сообщения
38
Репутация
0
версия AutoIt: 3.3.6.1
Описание: нужно создать генератор заполнения ячеек результат вывести в окно
1 )есть последовательность
Код:
Dim $money[$i]= [0,2.8, 2.1, 3.8, 6.9, 5.5, 10.34, 8.4, 10.4,  10.8, 16.7, 10.4, 15.4, 12.4, 10.22, 15.4, 17.5 , 5.6, 4.8, 10.42,10.6, 6.8 ]

2 )есть пять ячеек
3 ) нужно из данной последовательности чисел заполнить все пять ячеек
4) ячейки могут быть пустыми
5 ) сумма чисел в ячейках должна равняться заданной
6 ) вывести все варианты заполнения в окно
7 ) варианты не должны повторятся
Примечания:
пример в ячейках X X X X X ? сумма чисел в ячейках = 4,9
ответ варианты содержимого ячеек - - - 2.8 2.1
(самый простой вариант )
 

axlwor

Скриптер
Сообщения
657
Репутация
147
OffTopic:
Последовательность дал, а сумму?
 
Автор
Y

yuran2

Хочу все уметь
Сообщения
38
Репутация
0
axlwor
сумма может меняется (можно задавать в ручную ), числа для суммирования берутся из последовательности.
например задал сумму чисел = 11.1
результат: 1 вар - - - 5.5 5.6
2 вар - 2.8 - 2.8 5.5

делал так , долго варианты ищет
Код:
$mone = 5.5+5.6
Dim $money[22]= [0,2.8, 2.1, 3.8, 6.9, 5.5, 10.34, 8.4, 10.4,  10.8, 16.7, 10.4, 15.4, 12.4, 10.22, 15.4, 17.5 , 5.6, 4.8, 10.42,10.6, 6.8 ]
do
 $a=Random (0,21,1)
$b=Random (0,21,1)
$c=Random (0,21,1)
$d=Random (0,21,1)
$e=Random (0,21,1)
Until $money[$a]+ $money[$b]+$money[$c] +$money[$d] +$money[$e] = $mone 
msgBox(4096, " #" , $money[$a]& "- " &$money[$b]&"- "  &$money[$c] &"- "& $money[$d] &"- " &$money[$e] )

надо найти другой способ
 

axlwor

Скриптер
Сообщения
657
Репутация
147
хитро. значит... число из последовательности можно использовать любое число раз в одной серии?

для начала я выкинул бы из последовательности все значения больше суммы, а затем бы изъял бы рандом - он может повторяться.
Откуда взялась задача? (похожие задачи решали ДО компьютеров и научились это делать более оптимально)
 
Автор
Y

yuran2

Хочу все уметь
Сообщения
38
Репутация
0
axlwor
да, одно число из последовательности может быть и во всех ячейках.
...могу ещё, продолжить, этим числам из последовательности еще соответствуют предметы
например , 2.1 - куртка , 3.8 - носок , 6.9 - шапка , а 2.8 или другое любое число может быть или перчатка или рубашка
 

axlwor

Скриптер
Сообщения
657
Репутация
147
1. убираешь из последовательности лишнее. сортируешь.
2. перебираешь
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Попрошу всех участников дискуссии обойтись без постов рекомендательного характера. Т.к. раздел наз-ся Стол заказов, то уместнее будет публиковать сразу готовые решения.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
yuran2,
Вроде работает:
Код:
#include <Array.au3>

;массив сумм
Dim $aSum[21] = [20, 10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8, 10.9, 11, 11.1, 11.2, 11.3, 11.4, _
		11.5, 11.6, 11.7, 11.8, 11.9, 12]
;массив слагаемых
Dim $aMoney[22] = [21, 2.8, 2.1, 3.8, 6.9, 5.5, 9.4, 8.4, 2.2, 7.8, 2.3, 4.5, 1.4, 3.4, 0.7, _
		5.4, 1.7, 5.6, 4.8, 8.3, 11.1, 6.3]


For $x = 1 To $aSum[0]
	$iStart = TimerInit()
	Dim $aResult[1][5] = [[0]]
	$iCount = 0
	;1 слагаемое
	For $i = 1 To $aMoney[0]
		If $aMoney[$i] = $aSum[$x] Then
			$iCount += 1
			ReDim $aResult[$iCount + 1][5]
			$aResult[$iCount][0] = $aMoney[$i]
			For $r = 1 To 4
				$aResult[$iCount][$r] = '0'
			Next
		EndIf
	Next
	;2 слагаемых
	For $i = 1 To $aMoney[0] - 1
		For $j = $i + 1 To $aMoney[0]
			If $aMoney[$i] + $aMoney[$j] = $aSum[$x] Then
				$iCount += 1
				ReDim $aResult[$iCount + 1][5]
				$aResult[$iCount][0] = $aMoney[$i]
				$aResult[$iCount][1] = $aMoney[$j]
				For $r = 2 To 4
					$aResult[$iCount][$r] = '0'
				Next
			EndIf
		Next
	Next
	;3 слагаемых
	For $i = 1 To $aMoney[0] - 2
		For $j = $i + 1 To $aMoney[0] - 1
			For $q = $j + 1 To $aMoney[0]
				If $aMoney[$i] + $aMoney[$j] + $aMoney[$q] = $aSum[$x] Then
					$iCount += 1
					ReDim $aResult[$iCount + 1][5]
					$aResult[$iCount][0] = $aMoney[$i]
					$aResult[$iCount][1] = $aMoney[$j]
					$aResult[$iCount][2] = $aMoney[$q]
					For $r = 3 To 4
						$aResult[$iCount][$r] = '0'
					Next
				EndIf
			Next
		Next
	Next
	;4 слагаемых
	For $i = 1 To $aMoney[0] - 3
		For $j = $i + 1 To $aMoney[0] - 2
			For $q = $j + 1 To $aMoney[0] - 1
				For $w = $q + 1 To $aMoney[0]
					If $aMoney[$i] + $aMoney[$j] + $aMoney[$q] + $aMoney[$w] = $aSum[$x] Then
						$iCount += 1
						ReDim $aResult[$iCount + 1][5]
						$aResult[$iCount][0] = $aMoney[$i]
						$aResult[$iCount][1] = $aMoney[$j]
						$aResult[$iCount][2] = $aMoney[$q]
						$aResult[$iCount][3] = $aMoney[$w]
						$aResult[$iCount][4] = '0'
					EndIf
				Next
			Next
		Next
	Next
	;5 слагаемых
	For $i = 1 To $aMoney[0] - 4
		For $j = $i + 1 To $aMoney[0] - 3
			For $q = $j + 1 To $aMoney[0] - 2
				For $w = $q + 1 To $aMoney[0] - 1
					For $z = $w + 1 To $aMoney[0]
						If $aMoney[$i] + $aMoney[$j] + $aMoney[$q] + $aMoney[$w] + $aMoney[$z] = $aSum[$x] Then
							$iCount += 1
							ReDim $aResult[$iCount + 1][5]
							$aResult[$iCount][0] = $aMoney[$i]
							$aResult[$iCount][1] = $aMoney[$j]
							$aResult[$iCount][2] = $aMoney[$q]
							$aResult[$iCount][3] = $aMoney[$w]
							$aResult[$iCount][4] = $aMoney[$z]
						EndIf
					Next
				Next
			Next
		Next
	Next
	$sTime = StringFormat('%.2f ms', TimerDiff($iStart))
	If $iCount Then
		$aResult[0][0] = $iCount; кол-во вариантов
		_ArrayDisplay($aResult, $aSum[$x] & ' - ' & $x & '(' & $aSum[0] & ')  ' & $sTime)
	Else
		MsgBox(16, 'Error  ' & $sTime, 'Not ' & $aSum[$x])
	EndIf
Next
 
Автор
Y

yuran2

Хочу все уметь
Сообщения
38
Репутация
0
:laugh: madmasles спасибо! с небольшой переделкой точно нужно
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Код:
#include <array.au3>

Dim $nSum = 34, $money[22]= [0,2.8, 2.1, 3.8, 6.9, 5.5, 10.34, 8.4, 10.4,  10.8, 16.7, 10.4, 15.4, 12.4, 10.22, 15.4, 17.5 , 5.6, 4.8, 10.42,10.6, 6.8 ]

Dim $iFields = 5 ;количество полей
Dim $aFields[$iFields], $aResults[11][UBound($aFields)] = [[0]]

first($money, $aFields, $nSum)
_ArrayDisplay($aResults)

Func first($aNumbers, ByRef $aFields, $nSum)
	If _ArraySort($aNumbers) = 0 Then SetError(1, 0, False)
	If UBound($aFields, 0) <> 1 Then Return SetError(2, 0, False)
	If Not IsNumber($nSum) Or $nSum < 0 Then Return SetError(3, 0, False)
	Local $iNumbersLength = 0

	For $i = 1 To UBound($aNumbers)-1 Step +1
		If $aNumbers[$i] > $aNumbers[$iNumbersLength] Then
			If $aNumbers[$i] <= $nSum Then
				$iNumbersLength += 1
				$aNumbers[$iNumbersLength] = $aNumbers[$i]
			Else
				ExitLoop
			EndIf
		EndIf
	Next

	ReDim $aNumbers[$iNumbersLength+1]

	second($aNumbers, $aFields, $nSum, 0, 0)
	ReDim $aResults[$aResults[0][0]+1][UBound($aFields)]
EndFunc

Func second(ByRef $aNumbers, ByRef $aFields, ByRef $nSum, $iLevel, $iStart)
	Local $nFieldsSum

	For $i = $iStart To UBound($aNumbers)-1 Step +1
		If $iLevel = 0 Then $iStart = $i
		$aFields[$iLevel] = Number($aNumbers[$i])
		$nFieldsSum = sum($aFields)

		If $nFieldsSum = $nSum Then
			AddResult($aFields)
		ElseIf $nFieldsSum > $nSum Then
			ExitLoop
		ElseIf $iLevel < UBound($aFields)-1 Then
			second($aNumbers, $aFields, $nSum, $iLevel+1, $i)
		EndIf
	Next

	$aFields[$iLevel] = ''
EndFunc

Func sum(ByRef $aFields)
	Local $nSum = 0
	For $nField In $aFields
		$nSum += Number($nField)
	Next
	Return $nSum
EndFunc

Func AddResult($aFields)
	$aResults[0][0] += 1
	If $aResults[0][0] = UBound($aResults) Then ReDim $aResults[$aResults[0][0]+10][UBound($aFields)]
	For $i = 0 To UBound($aFields)-1 Step +1
		$aResults[$aResults[0][0]][$i] = $aFields[$i]
	Next
EndFunc
 
Верх