static void Main(string[] args) { int n = int.Parse(Console.ReadLine()); var items = Enumerable.Range(0, n) .Select(_ => ReadArray()) .Select(arr => new Item { Value = arr[1], Weight = arr[2] }) .ToArray(); double capacity = double.Parse(Console.ReadLine()); var stopwatch = new Stopwatch(); stopwatch.Start(); double seqResult = new DynamicProgrammingSolver().Solve(items, capacity); Console.WriteLine($"Result DP: {seqResult}. Elapsed: {stopwatch.ElapsedMilliseconds}"); stopwatch.Restart(); double bruteSeqResult = new BruteForceSovler().KnapsackRecursiveBrute(items, capacity, items.Length - 1); Console.WriteLine($"Result Sequential Brute Force: {bruteSeqResult}. Elapsed: {stopwatch.ElapsedMilliseconds}"); foreach (int threadCount in new[] { 1, 2, 4, 8 }) { stopwatch.Restart(); double bruteForceResult = GetBruteForceResult(items, capacity, threadCount); Console.WriteLine($"Result Brute Force: {bruteForceResult}. Thread Count: {threadCount}. Elapsed: {stopwatch.ElapsedMilliseconds}"); } }
private static double GetBruteForceResult(Item[] items, double capacity, int threadCount) { var tasks = new BruteForceSovler().ParallelizeKnapsack(items, capacity, items.Length - 1, threadCount).Select((func, i) => Task.Run(func)); var allTask = Task.WhenAll(tasks.Select((t, i) => t.ContinueWith((result) => { Console.WriteLine($"Task {i + 1} finished"); return(result.Result); }))); return(allTask.Result.Max()); }