Добрый день. Необходимо решить задачу методом перебора: дана матрица где строки станции, абоненты столбцы
пример:
0 1
1 0
т.е первая станция покрывает второго абонента, а вторая первого абонента. Необходимо методом перебора найти минимальное покрытие. Я реализовала жадный алгоритм, который смотрит кто покрывает больше и так далее.
Вот код:
Код:
// cover_bust.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
/*====================================================================================================
описание данных
====================================================================================================*/
int arr[100][100]; //матрица покрытия
int pocr[100]; //сколько каждая станция покрывает абонентов
int res[100]; //наибольшее покрытие наименьшим количеством станций
int count_res=0; //количество станций в результате
int count_view=0; //количество рассмотреных станций
int n,m; //количество строк (станции) количетсво аобонентов(столбцы)
/*====================================================================================================
процедуры и функции
====================================================================================================*/
int max_pocr() //находим какая станция покрывает больше абонентов: номер станции
{
int tmp=0;
for (int i=1;i<n;i++)
if (pocr[i]>pocr[tmp]) tmp=i;
return tmp;
}
/*====================================================================================================
главная программа
====================================================================================================*/
int _tmain(int argc, _TCHAR* argv[])
{
/*====================================================================================================
ввод данных
====================================================================================================*/
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
scanf("%d",&n);
scanf("%d",&m);
for (int i=0;i<n;i++)
{
int tmp=0;
for(int j=0;j<m;j++)
{
scanf("%d",&arr[i][j]);
if (arr[i][j]==1) tmp++; //подсчет того сколько абонентов покрывает станций
}
pocr[i]=tmp; // заполняем массив покрытия
}
/*====================================================================================================
перебор
====================================================================================================*/
int max_index=0;
printf("stations: \n");
while((count_view!=n) && (count_res!=m)) // пока все не просмотрели или пока все не учли
{
max_index=max_pocr(); // находим покрывающую больше всего
printf("%d ",max_index); //выводим покрывающую больше
count_view++; // отмечаем что просмотрели
for(int j=0;j<m;j++)
{
if(arr[max_index][j]==1) //если в строке 1 то бежим по столбцы чтобы откоректировать массив покрытьий и обновляем его
{
count_res++;
res[j]=1;
for(int i=0;i<n;i++)
{
if(arr[i][j]==1)
{
pocr[i]=pocr[i]-1;
arr[i][j]=0;
}
}
}
}
}
/*====================================================================================================
вывод результата перечисление тех абонентов которые покрыты
====================================================================================================*/
printf("\n spisok subscribers: \n");
for(int i=0;i<m;i++)
printf("%d ",res[i]);
return 0;
}
Нужен перебор, не понимаю как реализовать?