Đúng rồi đó. Ngân có thể tham khảo đoạn code sau (theo ngôn ngữ C) và điều chỉnh lại cho phù hợp yêu cầu bài toán:
Các biến sử dụng: n: Số CLB đăng ký tham gia; SL[size] là mảng lưu số lượng tương ứng của từng đội, Size là số tự nhiên nào đó đủ lớn để lớn hơn số CLB. VD: 1000; dem: biến đếm số CLB có thể thỏa điều kiện chia j thành viên, ThuTuCachChiaDoi: số thứ tự cách chia tương ứng với CachChia[ ] (j thành viên), SoTV[.]: mảng lưu số thành viên tham gia chung kết tương ứng cách chia thứ ThuTuCachChiaDoi và số thành viên 1 đội là CachChia [.] thành vien.
Ví dụ: Có 3 cách chia thành viên mỗi đội gồm {2,3,4} thành viên tương ứng số thành viên tham gia chung kết là {6,9,12} lập trình viên => ThuTuCachChiaDoi = 3, CachChia[1]=2;SoTV[1] = 6; CachChia[2]=3;SoTV[2] = 9; CachChia[3]=4;SoTV[3] = 12;
void main()
{
int SL[SIZE], n,dem,SoTV[SIZE],ThuTuCachChiaDoi=0, CachChia[SIZE];
NhapMang(SL, n); // Nhập số CLB tham gia. và số thành viên tương ứng mỗi đội
InPhanTuMang(SL, n); // Hiển thị số thành viên mỗi câu lạc bộ
printf("\n Phan tu lon nhat la: %d\n", Max(SL, n)); // In giá trị lớn nhất của mảng SL. Giả sử đã code hàm Max của mảng SL, n phần tử
for (int j = 2; j <= Max(SL, n); j++) //Biến j duyệt qua lần lượt số thành viên 1 đội có thể có
{
dem = 0; //Khởi tạo biến đếm để đếm số CLB có thể thỏa cách chia j thành viên
for (int i = 0; i < n; i++) //Duyệt qua lần lượt từng CLB
{
if (SL[i]%j==0) //Kiểm tra CLB i có thỏa cách chia j thành viên 1 đội không
dem++; // thỏa thì tăng biến đếm.
}
if (dem >1) //sau khi duyệt qua các đội, thì nếu với cách chia j thành viên, có dem > 1 CLB thì cách j sẽ được chọn. chỉ chọn cách có dem > 1 tương ứng với từ 2 CLB thỏa điều kiện trở lên mới hợp lý.
{
ThuTuCachChiaDoi++; // tăng thứ tự lên 1, chỉ xét từ 1 trở đi cho dễ hiểu.
CachChia[ThuTuCachChiaDoi] = j; //Lưu số thành viên 1 đội vào thứ tự chia tương ứng với j thành viên 1 đội (Mảng này sẽ có (ThuTuCachChiaDoi +1) phần tử
SoTV[ThuTuCachChiaDoi] = dem*j; // Lưu Số lập trình viên tham gia chung kết tương ứng thứ tự chia và cách chia j thành viên viên. Mảng này sẽ có (ThuTuCachChiaDoi +1) phần tử
}
}
printf("\nCo %d cach chia doi\n", ThuTuCachChiaDoi);
printf("\nCo %d thanh vien tham gia chung ket\n", Max(SoTV, ThuTuCachChiaDoi + 1));
for (int i = 1; i <= ThuTuCachChiaDoi; i++) //Duyệt qua lần lượt các cách chia có thể có
{
if (SoTV[i]==Max(SoTV,ThuTuCachChiaDoi+1)) (Cách chia nào có số lập trình viên tham gia chung kết là nhiều nhất
printf("\nChia moi doi: %d thanh vien se co so thanh vien tham gia chung ket la: %d\n", CachChia[i], SoTV[i]); // in ra số thành viên lớn nhất
}
Kỹ thuật BruteForce mình chưa biết đến. Vì mình không chuyên về lập trình. Cho mình hỏi là sao phải chia chẵn vậy @rogp10, Vì có thể là số lẻ mà.