Для наглядности пример:
Вводимые данные:
А = 3563 (всегда целое число)
mass = [5,7,10] (здесь могут присутствовать и вещественные числа)
Необходимо подобрать к каждому числу из массива mass такой множитель, сумма произведений подобранных чисел и элементов заданного массива mass которых будет равна 3563.
Множителей должно быть столько же, сколько элементов в mas. Они должны быть ЦЕЛОЧИСЛЕННЫМИ.
Например:
(5 * 126) + (7 * 139) + (10 * 196) = 3563
mass вводится вручную, его размер не зафиксирован условиями задачи, т. е. этот массив может состоять как из 3 элементов, так и из 33 итп.
Помогите, пожалуйста, найти или составить алгоритм решения этой задачи.
Другие языки программирования и технологии
Помогите найти алгоритм подбора множителей к числам заданного массива, сумма произведений которых равна заданному числу
Условия задачи:
Дано
- число N=3563 - требуемая сумма
- число n=3 - количество элементов массива mass
- последовательность чисел A=[A1, A2, … , An]=[5, 7, 10] - массив mass
- все числа целые
Найти
все последовательности X=[X1, X2, … , Xn] такие, что X*A=X1*A1+X2*A2+…+Xn*An=N
Для начала, если требуются именно ЦЕЛЫЕ, а не НЕОТРИЦАТЕЛЬНЫЕ числа, то решений может быть бесконечно много: 0=0*4+0*2=1*4+(-2)*2=(-1)*4+2*2=2*4+(-4)*2
Идея ясна? В случае с бесконечным количеством решений никакой алгоритм не поможет.
Так что рассмотрим неотрицательный случай (N, Ai, Xi - неотрицательные, n - положительное)
Очевидно, что все Xi: 0<=Xi<=(N div Ai) - целочисленное деление
Почему очевидно, а просто потому, что если хотьXi > (N div Ai), то Xi*Ai > N, что означает, что X с таким Xi не удовлетворяет X*A=N
То есть надо устроить перебор всех Xi от 0 до (N div Ai) и проверить сумму.
Это простой цикл (псевдокод на языке С) :
for (X=0; X<Xmax; X++) {if (X*A=N) print(X);}
Здесь X, A - последовательности
Что нужно:
1. X=0 - установить нулевой элемент X: все Xi=0 для i=1…n
2. кто такой Xmax : Xi = (N div Ai) для i=1…(n-1) Xn=(N div Ai)+1 или увеличить разрядность до n+1 и Xmax=[0, …, 0, 1] а X=[X1, …, Xn, 0] - последний вариант мне нравится больше
3. сравнение X и Y: X<Y если Xi<Yi для i=n…1 (сравнение начинаем со "старших" разрядов)
4. X++ -получение следующего X: T=X++ положим T1=X1+1, если Ti>(N div Ai) то Ti=0, а T(i+1)=X(i+1)+1 иначе T(i+1)=X(i+1) - это типа переноса 1 в старший разряд при переполнении
5. X*A - просто покомпонентное умножение и сложение
6. print(X) - вывод X на экран.
на C нужно написать функции для пунктов 1…6
на С++ можно написать класс для X и A с перегрузкой операторов =,<,++,*,<< тогда цикл будет выглядеть точно так, как написано.
Дано
- число N=3563 - требуемая сумма
- число n=3 - количество элементов массива mass
- последовательность чисел A=[A1, A2, … , An]=[5, 7, 10] - массив mass
- все числа целые
Найти
все последовательности X=[X1, X2, … , Xn] такие, что X*A=X1*A1+X2*A2+…+Xn*An=N
Для начала, если требуются именно ЦЕЛЫЕ, а не НЕОТРИЦАТЕЛЬНЫЕ числа, то решений может быть бесконечно много: 0=0*4+0*2=1*4+(-2)*2=(-1)*4+2*2=2*4+(-4)*2
Идея ясна? В случае с бесконечным количеством решений никакой алгоритм не поможет.
Так что рассмотрим неотрицательный случай (N, Ai, Xi - неотрицательные, n - положительное)
Очевидно, что все Xi: 0<=Xi<=(N div Ai) - целочисленное деление
Почему очевидно, а просто потому, что если хотьXi > (N div Ai), то Xi*Ai > N, что означает, что X с таким Xi не удовлетворяет X*A=N
То есть надо устроить перебор всех Xi от 0 до (N div Ai) и проверить сумму.
Это простой цикл (псевдокод на языке С) :
for (X=0; X<Xmax; X++) {if (X*A=N) print(X);}
Здесь X, A - последовательности
Что нужно:
1. X=0 - установить нулевой элемент X: все Xi=0 для i=1…n
2. кто такой Xmax : Xi = (N div Ai) для i=1…(n-1) Xn=(N div Ai)+1 или увеличить разрядность до n+1 и Xmax=[0, …, 0, 1] а X=[X1, …, Xn, 0] - последний вариант мне нравится больше
3. сравнение X и Y: X<Y если Xi<Yi для i=n…1 (сравнение начинаем со "старших" разрядов)
4. X++ -получение следующего X: T=X++ положим T1=X1+1, если Ti>(N div Ai) то Ti=0, а T(i+1)=X(i+1)+1 иначе T(i+1)=X(i+1) - это типа переноса 1 в старший разряд при переполнении
5. X*A - просто покомпонентное умножение и сложение
6. print(X) - вывод X на экран.
на C нужно написать функции для пунктов 1…6
на С++ можно написать класс для X и A с перегрузкой операторов =,<,++,*,<< тогда цикл будет выглядеть точно так, как написано.
Тупым перебором:
1) 5x0 + 7x9 + 10x350 = 3563
2) 5x0 + 7x19 + 10x343 = 3563
3) 5x0 + 7x29 + 10x336 = 3563
4) 5x0 + 7x39 + 10x329 = 3563
5) 5x0 + 7x49 + 10x322 = 3563
6) 5x0 + 7x59 + 10x315 = 3563
7) 5x0 + 7x69 + 10x308 = 3563
8) 5x0 + 7x79 + 10x301 = 3563
9) 5x0 + 7x89 + 10x294 = 3563
10) 5x0 + 7x99 + 10x287 = 3563
11) 5x0 + 7x109 + 10x280 = 3563
12) 5x0 + 7x119 + 10x273 = 3563
13) 5x0 + 7x129 + 10x266 = 3563
14) 5x0 + 7x139 + 10x259 = 3563
15) 5x0 + 7x149 + 10x252 = 3563
16) 5x0 + 7x159 + 10x245 = 3563
17) 5x0 + 7x169 + 10x238 = 3563
18) 5x0 + 7x179 + 10x231 = 3563
19) 5x0 + 7x189 + 10x224 = 3563
20) 5x0 + 7x199 + 10x217 = 3563
21) 5x0 + 7x209 + 10x210 = 3563
22) 5x0 + 7x219 + 10x203 = 3563
23) 5x0 + 7x229 + 10x196 = 3563
24) 5x0 + 7x239 + 10x189 = 3563
25) 5x0 + 7x249 + 10x182 = 3563
26) 5x0 + 7x259 + 10x175 = 3563
27) 5x0 + 7x269 + 10x168 = 3563
28) 5x0 + 7x279 + 10x161 = 3563
29) 5x0 + 7x289 + 10x154 = 3563
30) 5x0 + 7x299 + 10x147 = 3563
31) 5x0 + 7x309 + 10x140 = 3563
32) 5x0 + 7x319 + 10x133 = 3563
33) 5x0 + 7x329 + 10x126 = 3563
34) 5x0 + 7x339 + 10x119 = 3563
35) 5x0 + 7x349 + 10x112 = 3563
36) 5x0 + 7x359 + 10x105 = 3563
37) 5x0 + 7x369 + 10x98 = 3563
38) 5x0 + 7x379 + 10x91 = 3563
39) 5x0 + 7x389 + 10x84 = 3563
40) 5x0 + 7x399 + 10x77 = 3563
41) 5x0 + 7x409 + 10x70 = 3563
42) 5x0 + 7x419 + 10x63 = 3563
43) 5x0 + 7x429 + 10x56 = 3563
44) 5x0 + 7x439 + 10x49 = 3563
45) 5x0 + 7x449 + 10x42 = 3563
46) 5x0 + 7x459 + 10x35 = 3563
47) 5x0 + 7x469 + 10x28 = 3563
48) 5x0 + 7x479 + 10x21 = 3563
49) 5x0 + 7x489 + 10x14 = 3563
50) 5x0 + 7x499 + 10x7 = 3563
51) 5x0 + 7x509 + 10x0 = 3563
52) 5x1 + 7x4 + 10x353 = 3563
53) 5x1 + 7x14 + 10x346 = 3563
54) 5x1 + 7x24 + 10x339 = 3563
55) 5x1 + 7x34 + 10x332 = 3563
56) 5x1 + 7x44 + 10x325 = 3563
57) 5x1 + 7x54 + 10x318 = 3563
58) 5x1 + 7x64 + 10x311 = 3563
59) 5x1 + 7x74 + 10x304 = 3563
60) 5x1 + 7x84 + 10x297 = 3563
61) 5x1 + 7x94 + 10x290 = 3563
62) 5x1 + 7x104 + 10x283 = 3563
63) 5x1 + 7x114 + 10x276 = 3563
64) 5x1 + 7x124 + 10x269 = 3563
65) 5x1 + 7x134 + 10x262 = 3563
66) 5x1 + 7x144 + 10x255 = 3563
67) 5x1 + 7x154 + 10x248 = 3563
68) 5x1 + 7x164 + 10x241 = 3563
69) 5x1 + 7x174 + 10x234 = 3563
70) 5x1 + 7x184 + 10x227 = 3563
71) 5x1 + 7x194 + 10x220 = 3563
72) 5x1 + 7x204 + 10x213 = 3563
73) 5x1 + 7x214 + 10x206 = 3563
74) 5x1 + 7x224 + 10x199 = 3563
75) 5x1 + 7x234 + 10x192 = 3563
76) 5x1 + 7x244 + 10x185 = 3563
77) 5x1 + 7x254 + 10x178 = 3563
78) 5x1 + 7x264 + 10x171 = 3563
79) 5x1 + 7x274 + 10x164 = 3563
80) 5x1 + 7x284 + 10x157 = 3563
81) 5x1 + 7x294 + 10x150 = 3563
82) 5x1 + 7x304 + 10x143 = 3563
83) 5x1 + 7x314 + 10x136 = 3563
84) 5x1 + 7x324 + 10x129 = 3563
85) 5x1 + 7x334 + 10x122 = 3563
86) 5x1 + 7x344 + 10x115 = 3563
87) 5x1 + 7x354 + 10x108 = 3563
88) 5x1 + 7x364 + 10x101 = 3563
89) 5x1 + 7x374 + 10x94 = 3563
90) 5x1 + 7x384 + 10x87 = 3563
91) 5x1 + 7x394 + 10x80 = 3563
92) 5x1 + 7x404 + 10x73 = 3563
93) 5x1 + 7x414 + 10x66 = 3563
94) 5x1 + 7x424 + 10x59 = 3563
95) 5x1 + 7x434 + 10x52 = 3563
96) 5x1 + 7x444 + 10x45 = 3563
97) 5x1 + 7x454 + 10x38 = 3563
98) 5x1 + 7x464 + 10x31 = 3563
99) 5x1 + 7x474 + 10x24 = 3563
100) 5x1 + 7x484 + 10x17 = 3563
101) 5x1 + 7x494 + 10x10 = 3563
1) 5x0 + 7x9 + 10x350 = 3563
2) 5x0 + 7x19 + 10x343 = 3563
3) 5x0 + 7x29 + 10x336 = 3563
4) 5x0 + 7x39 + 10x329 = 3563
5) 5x0 + 7x49 + 10x322 = 3563
6) 5x0 + 7x59 + 10x315 = 3563
7) 5x0 + 7x69 + 10x308 = 3563
8) 5x0 + 7x79 + 10x301 = 3563
9) 5x0 + 7x89 + 10x294 = 3563
10) 5x0 + 7x99 + 10x287 = 3563
11) 5x0 + 7x109 + 10x280 = 3563
12) 5x0 + 7x119 + 10x273 = 3563
13) 5x0 + 7x129 + 10x266 = 3563
14) 5x0 + 7x139 + 10x259 = 3563
15) 5x0 + 7x149 + 10x252 = 3563
16) 5x0 + 7x159 + 10x245 = 3563
17) 5x0 + 7x169 + 10x238 = 3563
18) 5x0 + 7x179 + 10x231 = 3563
19) 5x0 + 7x189 + 10x224 = 3563
20) 5x0 + 7x199 + 10x217 = 3563
21) 5x0 + 7x209 + 10x210 = 3563
22) 5x0 + 7x219 + 10x203 = 3563
23) 5x0 + 7x229 + 10x196 = 3563
24) 5x0 + 7x239 + 10x189 = 3563
25) 5x0 + 7x249 + 10x182 = 3563
26) 5x0 + 7x259 + 10x175 = 3563
27) 5x0 + 7x269 + 10x168 = 3563
28) 5x0 + 7x279 + 10x161 = 3563
29) 5x0 + 7x289 + 10x154 = 3563
30) 5x0 + 7x299 + 10x147 = 3563
31) 5x0 + 7x309 + 10x140 = 3563
32) 5x0 + 7x319 + 10x133 = 3563
33) 5x0 + 7x329 + 10x126 = 3563
34) 5x0 + 7x339 + 10x119 = 3563
35) 5x0 + 7x349 + 10x112 = 3563
36) 5x0 + 7x359 + 10x105 = 3563
37) 5x0 + 7x369 + 10x98 = 3563
38) 5x0 + 7x379 + 10x91 = 3563
39) 5x0 + 7x389 + 10x84 = 3563
40) 5x0 + 7x399 + 10x77 = 3563
41) 5x0 + 7x409 + 10x70 = 3563
42) 5x0 + 7x419 + 10x63 = 3563
43) 5x0 + 7x429 + 10x56 = 3563
44) 5x0 + 7x439 + 10x49 = 3563
45) 5x0 + 7x449 + 10x42 = 3563
46) 5x0 + 7x459 + 10x35 = 3563
47) 5x0 + 7x469 + 10x28 = 3563
48) 5x0 + 7x479 + 10x21 = 3563
49) 5x0 + 7x489 + 10x14 = 3563
50) 5x0 + 7x499 + 10x7 = 3563
51) 5x0 + 7x509 + 10x0 = 3563
52) 5x1 + 7x4 + 10x353 = 3563
53) 5x1 + 7x14 + 10x346 = 3563
54) 5x1 + 7x24 + 10x339 = 3563
55) 5x1 + 7x34 + 10x332 = 3563
56) 5x1 + 7x44 + 10x325 = 3563
57) 5x1 + 7x54 + 10x318 = 3563
58) 5x1 + 7x64 + 10x311 = 3563
59) 5x1 + 7x74 + 10x304 = 3563
60) 5x1 + 7x84 + 10x297 = 3563
61) 5x1 + 7x94 + 10x290 = 3563
62) 5x1 + 7x104 + 10x283 = 3563
63) 5x1 + 7x114 + 10x276 = 3563
64) 5x1 + 7x124 + 10x269 = 3563
65) 5x1 + 7x134 + 10x262 = 3563
66) 5x1 + 7x144 + 10x255 = 3563
67) 5x1 + 7x154 + 10x248 = 3563
68) 5x1 + 7x164 + 10x241 = 3563
69) 5x1 + 7x174 + 10x234 = 3563
70) 5x1 + 7x184 + 10x227 = 3563
71) 5x1 + 7x194 + 10x220 = 3563
72) 5x1 + 7x204 + 10x213 = 3563
73) 5x1 + 7x214 + 10x206 = 3563
74) 5x1 + 7x224 + 10x199 = 3563
75) 5x1 + 7x234 + 10x192 = 3563
76) 5x1 + 7x244 + 10x185 = 3563
77) 5x1 + 7x254 + 10x178 = 3563
78) 5x1 + 7x264 + 10x171 = 3563
79) 5x1 + 7x274 + 10x164 = 3563
80) 5x1 + 7x284 + 10x157 = 3563
81) 5x1 + 7x294 + 10x150 = 3563
82) 5x1 + 7x304 + 10x143 = 3563
83) 5x1 + 7x314 + 10x136 = 3563
84) 5x1 + 7x324 + 10x129 = 3563
85) 5x1 + 7x334 + 10x122 = 3563
86) 5x1 + 7x344 + 10x115 = 3563
87) 5x1 + 7x354 + 10x108 = 3563
88) 5x1 + 7x364 + 10x101 = 3563
89) 5x1 + 7x374 + 10x94 = 3563
90) 5x1 + 7x384 + 10x87 = 3563
91) 5x1 + 7x394 + 10x80 = 3563
92) 5x1 + 7x404 + 10x73 = 3563
93) 5x1 + 7x414 + 10x66 = 3563
94) 5x1 + 7x424 + 10x59 = 3563
95) 5x1 + 7x434 + 10x52 = 3563
96) 5x1 + 7x444 + 10x45 = 3563
97) 5x1 + 7x454 + 10x38 = 3563
98) 5x1 + 7x464 + 10x31 = 3563
99) 5x1 + 7x474 + 10x24 = 3563
100) 5x1 + 7x484 + 10x17 = 3563
101) 5x1 + 7x494 + 10x10 = 3563
Похожие вопросы
- Помогите найти, алгоритм нахождения Произведения простых чисел, на С++, или литературу которая поможет разобраться.
- Помогите найти алгоритм вычисления простых чисел
- Среди двузначных чисел вывести на экран те, сумма цифр которых равна х(0<х<18). Число х вводится с клавиатуры.В паскале!
- Помогите найти все возможные вариации положительных и отрицательных чисел в массиве.
- Информатика. Программирование. Обработка массивов данных. Помогите составить алгоритм и прог. код к нему.
- Подсчитать количество 3-значных чисел,сумма цифр которых меньше либо равна 24
- Помогите решить на ПАСКАЛЕ!Увеличить четные числа массива размера N,на исходное значение первого четного числа.
- алгоритм... по нахождению общих элементов двух массивов
- C# Дан массив размера N. Найти 2 элемента массива, сумма которых наиболее близка к максимуму массива и поменять
- Помогите найти сумму цифр числа N в С++