Program.cs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. class InvestmentOptimizer
  6. {
  7. static void Main()
  8. {
  9. string inputFilePath = "C:\\Users\\admin\\source\\repos\\InvestmentAllocation\\InvestmentAllocation\\test.txt";
  10. string outputFilePath = "result.txt";
  11. // Чтение данных из файла
  12. var lines = File.ReadAllLines(inputFilePath);
  13. int numLevels = lines.Length;
  14. int numEnterprises = lines[0].Split(' ').Length - 1;
  15. int[,] profits = new int[numLevels, numEnterprises + 1];
  16. int[] investmentLevels = new int[numLevels];
  17. for (int i = 0; i < numLevels; i++)
  18. {
  19. var values = lines[i].Split(' ').Select(int.Parse).ToArray();
  20. investmentLevels[i] = values[0];
  21. for (int j = 0; j < numEnterprises; j++)
  22. {
  23. profits[i, j + 1] = values[j + 1];
  24. }
  25. }
  26. int totalInvestment = investmentLevels[numLevels - 1]; // Последнее значение первого столбца
  27. // Инициализация массива для хранения максимальной прибыли
  28. int[,] dp = new int[numEnterprises + 1, totalInvestment + 1];
  29. int[,] investmentTrack = new int[numEnterprises + 1, totalInvestment + 1];
  30. // Заполнение таблицы динамического программирования
  31. for (int i = 1; i <= numEnterprises; i++)
  32. {
  33. for (int j = 0; j <= totalInvestment; j++)
  34. {
  35. for (int k = 0; k < numLevels; k++)
  36. {
  37. if (investmentLevels[k] <= j)
  38. {
  39. int profit = profits[k, i] + dp[i - 1, j - investmentLevels[k]];
  40. if (profit > dp[i, j])
  41. {
  42. dp[i, j] = profit;
  43. investmentTrack[i, j] = investmentLevels[k];
  44. }
  45. }
  46. }
  47. }
  48. }
  49. // Восстановление решения
  50. int remainingInvestment = totalInvestment;
  51. var allocation = new int[numEnterprises + 1];
  52. for (int i = numEnterprises; i > 0; i--)
  53. {
  54. allocation[i] = investmentTrack[i, remainingInvestment];
  55. remainingInvestment -= allocation[i];
  56. }
  57. int maxProfit = dp[numEnterprises, totalInvestment];
  58. // Запись результата в файл
  59. using (var writer = new StreamWriter(outputFilePath))
  60. {
  61. writer.WriteLine($"Итак, инвестиции в размере {totalInvestment} необходимо распределить следующим образом:");
  62. for (int i = 1; i <= numEnterprises; i++)
  63. {
  64. writer.WriteLine($"{i}-му предприятию выделить {allocation[i]}");
  65. }
  66. writer.WriteLine($"Максимальная прибыль: {maxProfit}");
  67. }
  68. }
  69. }