using System.Collections.Generic;
List<string> shipments = new List<string> { "sh1", "sh2", "sh3", "sh4", "sh5", "sh6", "sh7", "sh8", "sh9", "sh10", "sh11", "sh12", "sh13", "sh14", "sh15", "sh16", "sh17", "sh18", "sh19", "sh20" };
List<int> zoneCapacities = new List<int> { 15,15,15,15};
Dictionary<int, List<string>> distribution = DistributeShipments(totalShipments, zoneCapacities, shipments);
Console.WriteLine("Shipments distribution in Zones:");
foreach (var kvp in distribution)
Console.WriteLine($"Zone {kvp.Key}: {string.Join(",", kvp.Value)}");
static Dictionary<int, List<string>> DistributeShipments(int totalShipments, List<int> zoneCapacities, List<string> shipments)
Random random = new Random();
Dictionary<int, List<string>> distribution = new Dictionary<int, List<string>>();
for (int i = 0; i < zoneCapacities.Count; i++)
distribution[i + 1] = new List<string>();
int zones = zoneCapacities.Count;
int shipmentsPerZone = totalShipments / zones;
int remainingShipments = totalShipments % zones;
for (int zoneIndex = 0; zoneIndex < zones; zoneIndex++)
int currentZone = zoneIndex + 1;
int shipmentsToAdd = Math.Min(shipmentsPerZone, zoneCapacities[zoneIndex] - distribution[currentZone].Count);
for (int shipment = 0; shipment < shipmentsToAdd; shipment++)
int randomShipmentIndex = random.Next(0, shipments.Count);
distribution[currentZone].Add(shipments[randomShipmentIndex]);
shipments.RemoveAt(randomShipmentIndex);
for (int shipment = 0; shipment < remainingShipments; shipment++)
int randomZoneIndex = random.Next(0, zones);
int currentZone = randomZoneIndex + 1;
if (distribution[currentZone].Count < zoneCapacities[randomZoneIndex])
int randomShipmentIndex = random.Next(0, shipments.Count);
distribution[currentZone].Add(shipments[randomShipmentIndex]);
shipments.RemoveAt(randomShipmentIndex);