Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
1

Задача перебора элементов

21.04.2012, 05:35. Показов 3701. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет! Собственно есть задача с которой я не могу совладать. Загвоздка не в программировании, а в том чтоб придумать алгоритм, чтобы решал эту задачу. Может кто подскажет, я уже всю голову сломал.
Задача на первый взгляд элементарная, но это только на первый взгляд.
Задача: есть некоторая разнородная многопроцессорная система, которая состоит из N типов процессоров и mi процессоров каждого типа, i=0,...,N. Система описывается сменой состояний a, например при N=3, a(0,0,0) - нет ни одного запроса к шине, а(1,0,0) - есть один запрос от процессоров первого типа, а(1,1,0) - есть по 1 запросу к шине от процессоров первого и второго типа. Есть формула для оценки вероятности нахождения системы в каждом состоянии, в этой формуле необходимо перебрать все возможные варианты состояний. Собственно как организовать этот перебор я и не могу придумать. Можно организовать N вложенных друг в друга циклов, но мне нужно, что число N задавалось пользователем и все считалось.
Пример перебора: N = 3, m1 = 2, m2 = 3, m3 = 1.
Состояния системы
000
100
200
010
110
210
020
120
220
030
130
230
001
101
201
011
111
211
и т.д.

Подскажите, может я не могу догнать до какого-то очевидного и простого решения?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.04.2012, 05:35
Ответы с готовыми решениями:

Задача о рюкзаке методом полного перебора. Нужно пояснение по коду
Здравствуйте, нужно пояснение по этому коду. Код не мой, также в нем много ошибок. Заранее спасибо....

Метод полного перебора. Задача о назначениях
Всем привет, ребят очень нужна помощь в решении задачи!!! Нужно написать код программы на с#, где...

Задача коммивояжера,метод полного перебора
Мне нужна написать программу, которая решает задачу коммивояжера (метод полного перебора) на C# или...

Цикл перебора элементов в webbrowser
dim scanId as long scanId = 1 dim checkElement as HTMLInputElement checkElement =...

5
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
21.04.2012, 07:37 2
вариант:
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
#include <iostream>
using namespace std;
#define N_max 10
int mas[N_max], mas1[N_max], N;
void rec(int a)
{
    int i;
    if(a==N)
    {
        for(i=0; i<N; i++)
            cout<<mas1[i]<<" ";
        cout<<endl;
        return;
    }
    for(i=0; i<=mas[a]; i++)
    {
        mas1[a]=i;
        rec(a+1);
    }
}
int main()
{
    int i;
    cout<<"N= "; cin>>N;
    for(i=0; i<N; i++)
    {
        cout<<"m"<<i+1<<"= "; cin>>mas[i];
    }
    rec(0);
    return 0; 
}
1
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
21.04.2012, 10:56  [ТС] 3
Ух, блин, чот тут с рекурсией, нельзя ли некоторые места раскоментить, а то я некоторые моменты и не знаю?..
Вот тут где границы и цикла и что делает return?
Цитата Сообщение от valeriikozlov Посмотреть сообщение
for(i=0; i<N; i++)
cout<<mas1[i]<<" ";
cout<<endl;
return;
А вот тут как вы сделали, что оно в консольке начинали все с новой строчки без endl'ов?
Цитата Сообщение от valeriikozlov Посмотреть сообщение
cout<<"N= "; cin>>N;
for(i=0; i<N; i++)
{
cout<<"m"<<i+1<<"= "; cin>>mas[i];
}
Ну и идею бы на словах еще.
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
21.04.2012, 12:05 4
Цитата Сообщение от Woody-krsk Посмотреть сообщение
Ну и идею бы на словах еще.
лучше с этого и начать.
Идея: перебор всех вариантов с помощью рекурсии.
Эта часть:
Цитата Сообщение от valeriikozlov Посмотреть сообщение
cout<<"N= "; cin>>N;
for(i=0; i<N; i++)
{
cout<<"m"<<i+1<<"= "; cin>>mas[i];
}
в консольке ничего не выводит с новой строчки, а просто идет заполнение значениями mi массива mas[].
Далее следует вызов: rec(0); - начинаем работать с первым элементом вариантов состояний.

см комментарии:
Цитата Сообщение от valeriikozlov Посмотреть сообщение
void rec(int a)
{
int i;
if(a==N)// если количество элементов равно N
{
for(i=0; i<N; i++)// то выводим на экран очередной вариант, записанный в mas1[]
cout<<mas1[i]<<" ";
cout<<endl;// переводим на новую строку
return;// и возвращаемся из функции rec()
}
for(i=0; i<=mas[a]; i++)// эта точка будет достижима когда a<N. Для очередного элемента с индексом a, перебираем возможные варианты от 0 до m[a]
{
mas1[a]=i;// и записываем эти значения в mas1[a]
rec(a+1);// вызываем рек.функцию для значения со следующим индексом
}
}
1
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
22.04.2012, 04:54  [ТС] 5
Все равно куча вопросов, но пока попробую разобраться сам, никогда с рекурсией раньше не работал.
Один вопрос главный, return возвращает нас в то место, где функция была вызвана, правильно?
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
22.04.2012, 06:24 6
Цитата Сообщение от Woody-krsk Посмотреть сообщение
Один вопрос главный, return возвращает нас в то место, где функция была вызвана, правильно?
да, все правильно
0
22.04.2012, 06:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.04.2012, 06:24
Помогаю со студенческими работами здесь

Исключение элементов из перебора и последовательность двойки
Первый вопрос Как исключить элемент из перебор? Допустим у меня есть массив и мне нужно найти...

Увеличить скорость перебора элементов массива
Всем привет! Пишу тут первый раз, так что, не ругайте за возможные косяки. Дело вот в чем:...

Условие окончания перебора элементов строки
Как она работает , что в неё прописано ? while(text != '\0') i++; вот вижу цикл... И в цикле...

Синтаксическое расширение для перебора элементов списка
Готовлюсь к экзамену, не пойму, что означает запись под пунктом 1,3 и что такое квалификатор. О чем...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru