Не получается довести до ума задачу по программированию на языке си
Нашел задачу которая у меня вызвала затруднение. Есть какие-то идеи но мне кажется что они не верные. Хочется разобраться в этой задаче и добавить ее в свою копилку.
Вот сама задача:
требуется написать и отладить программу , решающую методом перебора комбинаторную задачу. Желательно учесть все соображения, позволяющие сократить перебор.
- Задача о куче камней. Имеется N камней, известны их веса Pi (i=1...N), задано количество куч M. Требуется разложить камни на M куч так, чтобы минимизировать вес самой тяжелой кучи. (Вариант формулировки: даны N программ с длительностями Pi и M процессоров. Требуется распределить программы так, чтобы раньше закончить выполнение).
итак мне пришла идея найти считать с файла M и N и двумерный массив линия это кучи , а столбы вес Далее в функции я находил находил наибольшую и наименьшую кучу и номер позиции где стоит число. А дальше уже проблематично сделать. Есть что менять местами числа но это будет не полная переборка. Я чет запутался и не знаю как дальше сделать.
Вот код, что получилось
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#define MAX_VERTICES 200
int N=0, M=0;
int matrix[MAX_VERTICES][MAX_VERTICES];
void findMaxSet()
{
int cym[MAX_VERTICES] = {0};
int maxcol = 0;
int mincol;
int elemmax= 0;
int elemmin = 0;
int i2 = 0, j2 = 0;
while (j2 <= M) {
while (i2 <= N) {
cym[j2] = cym[j2] + matrix[i2][j2];
i2++;
}
j2++;
i2 = 0;
}
for (int i = 0; i < M; i++) {
if (maxcol < cym[i]) {
maxcol = cym[i]; }
elemmax = i;
}
mincol = maxcol;
for (int i = 0; i < M; i++) {
if (mincol > cym[i]) {
mincol = cym[i];
elemmin = i;
}
}
sort();
}
void sort() {
}
int main()
{
FILE* f = fopen("input.txt", "r");
fscanf_s(f, "%d %d", &N,&M);
for (int с = 0; с < N; с++) {
for (int сс = 0; сс < M; сс++) {
fscanf_s(f, "%d,", &matrix[с][сс]);
}
}
clock_t begin = clock();
findMaxSet();
clock_t end = clock();
return 0;
}