Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
 Аватар для Alfred_Nobel
2 / 2 / 0
Регистрация: 16.04.2010
Сообщений: 14

Генерация комбинаций чисел для заданой суммы

20.07.2010, 20:34. Показов 2444. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть массив чисел от 1 до 50. Пользователь вводит сумму и программа выбирает все возможные варианты чисел без повторений, т.е. нельзя использовать одну и ту же цифру больше 1 раза в одном варианте! Количество чисел - 5. Я не прошу код! Помогите мне понять сам алгоритм как это сделать. У меня что то идеи не очень... Заранее спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.07.2010, 20:34
Ответы с готовыми решениями:

Генерация возможных комбинаций из двух чисел 0 и 1 при условии что 0 и 1 должно быть по N-количеству
Нужно сгенерировать все возможные комбинации длинной 16 символов из нулей и единиц,при условии что 0 и 1 должно быть по N-количеству ...

Генерация случайных чисел и среднее значение их суммы
Здравствуйте! Хочу сразу обозначить свой уровень компьютерной грамотности - я обычный пользователь. В екселе разбираюсь плохо и очень...

Генерация комбинаций из n по m
Здравствуйте! Написала функцию для генерации комбинаций. Подскажите в чем ошибка, выдает не все варианты. int Generare(int Key, int...

3
Padawan
 Аватар для Johnny_D
473 / 323 / 30
Регистрация: 30.01.2010
Сообщений: 1,841
20.07.2010, 20:53
Кроме как банальный перебор комбинаций все чисел я ничего предложить не могу, единственное ограничение которое могу предложить, это отсечь те цифры, которые заранее больше суммы
1
MADE IN USSR
 Аватар для Товарищ
72 / 71 / 0
Регистрация: 01.06.2010
Сообщений: 203
21.07.2010, 01:19
Бери число из массива со случайным индексом присваивай его первой переменной и удаляй этот элемент массива, бери второе случайное число из массива со случайным индексом присваивай переменной и удаляй этот элемент из массива, и так до пяти чисел и потом сравнивай сумму с суммой этих чисел из массива.
1
 Аватар для s-kvv
76 / 73 / 9
Регистрация: 09.06.2010
Сообщений: 206
21.07.2010, 11:47
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
static void Main(string[] args)
        {
 
            int f;
            Console.Write("Введите сумму для поиска: ");
            f = Convert.ToInt32(Console.ReadLine());
            int[] a = GetColl(1, 50, 5, f);
            if (a != null)
                Print(a);
            else
                Console.WriteLine("Такую сумму невозможно составить");
            
            
            Console.ReadKey();
        }
 
        static int[] GetColl(int min, int max, int count, int s)
        {
            int minSumm=0,t,maxSumm=0;
            t = min;
            if (count < 1 || (max-min+1)<count) return null;
 
            for (int i = 0; i < count; i++)
            {
                minSumm += t++;
            }
            t = max;
            for (int i = 0; i < count; i++)
            {
                maxSumm += t--;
            }
 
            if (s > maxSumm || s < minSumm) return null;
 
            int[] arr = new int[count];
            bool ok = false;
            for (int i = min; i < (max - count + 2) && !ok; i++)
            {
                t = i;
                for (int j = 0; j < count; j++)
                    arr[j] = t++;
                
                for (int j = arr[count - 1]; j <= max && !ok; j++)
                {
                    arr[count - 1] = j;
                    if (Check(arr, s))
                        ok = true;
                }
            }
 
            if (!ok)
            {
                for (int i = max; i > (min + count - 1) && !ok; i--)
                {
                    t = i;
                    for (int j = 0; j < count; j++)
                        arr[j] = t--;
                    for (int j = arr[count - 1]; j >= min && !ok; j--)
                    {
                        arr[count - 1] = j;
                        if (Check(arr, s))
                            ok = true;
                    }
                }
            }
 
            return arr;
        }
 
        static bool Check(int[] a, int sum)
        {
            int s = 0;
            foreach (int i in a)
                s += i;
            return s == sum;
        }
 
        static void Print(int[] a)
        {
            foreach(int i in a)
                Console.Write("{0} ",i);
        }
Выводит первую найденную комбинацию
Без полного перебора, 1 или 2 прохода

Добавлено через 6 часов 7 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Введите сумму: ");
            int sum = Convert.ToInt32(Console.ReadLine());
 
            DoSomthing del = new DoSomthing(Do);
            Find(1, 50, 5, sum, del);
            Console.WriteLine("Press any key...");
            Console.ReadKey();
        }
 
        delegate void DoSomthing(int[] arr);
 
        static void Do(int[] arr)
        {
            Print(arr);
            Console.WriteLine();
        }
 
        static void Find(int min, int max, int count, int sum, DoSomthing doSomthing)
        {
 
            int minSumm = 0, t, maxSumm = 0;
            t = min;
            if (count < 1 || (max - min + 1) < count) return;
 
            for (int i = 0; i < count; i++)
            {
                minSumm += t++;
            }
            t = max;
            for (int i = 0; i < count; i++)
            {
                maxSumm += t--;
            }
 
            if (sum > maxSumm || sum < minSumm) return;
 
            int[] arr = new int[count];
            Find(min, max, count, sum, count, arr, doSomthing);
        }
 
        static bool Find(int min, int max, int count, int sum, int level, int[] arr, DoSomthing doSomthing)
        {
            if (level == 0 && Check(arr, sum))
            {
                if (doSomthing != null)
                    doSomthing(arr);
                return true;
            }
            else
            {
                bool ok = false;
                if (level != 0)
                    for (int i = min; i < (max - count + 2) && !ok; i++)
                    {
                        arr[count - level] = i;
                        ok = Find(arr[count - level] + 1, max, count, sum, level - 1, arr, doSomthing);
                    }
            }
            return false;
        }
 
        static bool Check(int[] a, int sum)
        {
            int s = 0;
            foreach (int i in a)
            {
                s += i;
            }
            return s == sum;
        }
 
        static void Print(int[] a)
        {
            foreach (int i in a)
                Console.Write("{0} ", i);
        }
    }
Ищет все наборы неповторяющихся чисел, дающих в сумме нужное число
Принемает делегат, что надо делать - туда
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.07.2010, 11:47
Помогаю со студенческими работами здесь

Генерация всевозможных комбинаций
Здравствуйте! Возникла следующая задача: есть таблица, в каждой строчке находится разное число не пустых ячеек , но при этом колчество...

Многопоточная генерация комбинаций
Здравствуйте. Хочу сделать генератор комбинация, вот код: import random num=list(&quot;1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ&quot;) ...

Определить количество комбинаций шайб, гаек и болтов для общей суммы покупки в 100 рублей
Задачка по программированию. Дано: Стоимость Болтов =10, Гаек=5, Шайб =0.5; Определить количество комбинаций для общей суммы покупки...

Генерация всех возможных комбинаций
Доброго времени суток, подскажите идею, нужно чтобы функция составила все возможные комбинации из цифр и английских букв.

Генерация всех комбинаций из символов
У меня есть массив array или строк f,d,d,o,g......... Как получить все комбинации с длиной(3 или 4) например: combination(string,3) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru