Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 24.12.2013
Сообщений: 7

Задача о ранце. Для ее решения использовать метод динамического программирования

10.01.2014, 02:21. Показов 4249. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Товарищи, помогите пожалуйста с программной реализацией задачи о ранце.

Система обработки информации реального времени в течение периода управления предназначена для выполнения определенного перечня задач, причем для реализации i-й задачи требуется ti- единиц процессорного времени, а общий ресурс процессорного времени составляет Т1 единиц времени. В результате отказа некоторых функциональных блоков вычислительной системы уменьшается ресурс процессорного времени до величины Т. С учетом степени важности i-й задачи - необходимо определить набор задач, обеспечивающий минимально возможную эффективность функционирование системы в условиях ограниченных ресурсов процессорного времени. В ходе выполнения работы рассматриваемую задачу необходимо представить как задачу о ранце и для ее решения использовать метод динамического программирования.
2.2. Численные данные: n=10, D=95,
cj=(5,7,12,14,7,6,5,10,7,8),
tj=(20,15,24,27,15,8,9,10,12,16).

n-кол-во задач
D- ресурс процессорного времени
cj-степень важности каждой задачи
tj- процессорное время, необходимое для решения каждой задачи.


пробовал вот этот код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
using System;
 
namespace ryukzak
{
    class Article //товар
    {
        public string name; //название товара
        public int weight; //вес товара
        public int price; //цена товара
        public bool take; //берем ли товар
 
        public Article(string n, int w, int p)
        {
            name = n;
            weight = w;
            price = p;
        }
    }
    
    class Program
    {
        public static Article[] articles;
        public static int numsArticle; // Количество товаров
        public static bool incorrEnter; //Переменная, что проверяет корректность ввода
        public static string name; // Имя товара
        public static int weight, price, maxWeight; // Вес и цена товара, размер рюкзака
        public static int[,] func; //массив для хранения значений функции
 
        // Метод выводит на экран рюкзак
        static void Print()
        {
            Console.WriteLine("\nМаксимальная стоимость: " + func[maxWeight, numsArticle-1]);
            Console.Write("Взяты следующие предметы: ");
            foreach (Article x in articles)
                if (x.take)
                    Console.Write(x.name + " ");
        }
 
        static void Main(string[] args)
        {
            int i, j; //просто переменные :)
 
            Console.WriteLine("Данная программа поможет Вам заполнить Ваш рюкзак максимально ценными товарами\nАвтор: Владимир Рыбалка");
            
            //Введем количество товаров
            do 
            {
                incorrEnter = false;
                Console.Write("\nКакое количество товаров вы рассматриваете для приобретения: ");
                try 
                {
                    numsArticle = Convert.ToInt32(Console.ReadLine());
                }
                catch(FormatException) 
                {
                    incorrEnter = true;
                    numsArticle = 0;
                }
            } while (incorrEnter);
 
            articles = new Article[numsArticle]; //Создаем массив заданного размера
 
            //Создадим объекты товаров
            for (i = 0, j = i + 1; i < articles.Length; i++, j++)
            {
                Console.Write("\n\nВведите название " + j + "-го товара: ");
                name = Console.ReadLine();
                do
                {
                    incorrEnter = false;
                    Console.Write("Введите вес товара: ");
                    try
                    {
                        weight = Convert.ToInt32(Console.ReadLine());
                    }
                    catch (FormatException)
                    {
                        incorrEnter = true;
                        weight = 0;
                    }
                } while (incorrEnter);
                do
                {
                    incorrEnter = false;
                    Console.Write("Введите цену товара: ");
                    try
                    {
                        price = Convert.ToInt32(Console.ReadLine());
                    }
                    catch (FormatException)
                    {
                        incorrEnter = true;
                        price = 0;
                    }
                } while (incorrEnter);
                articles[i] = new Article(name, weight, price); //Создаем объект
            }
 
            // Введем размер рюкзака
            do
                {
                    incorrEnter = false;
                    Console.Write("\nВведите размер вашего рюкзака (контейнера): ");
                    try
                    {
                        maxWeight = Convert.ToInt32(Console.ReadLine());
                    }
                    catch (FormatException)
                    {
                        incorrEnter = true;
                        maxWeight = 0;
                    }
                } while (incorrEnter);
 
            func = new int[maxWeight+1, numsArticle]; //Реализуем массив функции
 
            //Реализуем алгоритм Беллмана
            for (weight = 1; weight <= maxWeight; weight++) // Загружаем рюкзак если его вместимость = Weight
                for (i = 1; i < numsArticle; i++) // берем предметы с 1 по numsArticle
                    //если вес предмета больше Weight, или предыдущий набор лучше выбираемого
                    if (articles[i].weight > weight)
                    {
                        func[weight, i] = func[weight, i - 1]; //тогда берем предыдущий набор
                        articles[i].take = false;
                    }
                    else if (func[weight, i - 1] >= (func[weight - articles[i].weight, i - 1] + articles[i].price))
                    {
                        func[weight, i] = func[weight, i - 1]; //тогда берем предыдущий набор
                        articles[i].take = false;
                    }
                    else
                    {
                        func[weight, i] = func[weight - articles[i].weight, i - 1] + articles[i].price; //иначе добавляем к предыдущему набору текущий предмет
                        articles[i].take = true;
                    }
 
            Print();
            
            Console.ReadKey();
        }
    }
}
Но что-то не получается. помогите пожалуйста...

Добавлено через 8 часов 36 минут
Цитата Сообщение от foreverthing Посмотреть сообщение
Но что-то не получается. помогите пожалуйста...
а именно в идеале при выводе должны быть задачи 2 3 6 7 8 9 10
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.01.2014, 02:21
Ответы с готовыми решениями:

Задача о ранце, метод ветвей и границ
Есть ли у кого реализации метода ветвей и границ именно для решения задачи о ранце(рюкзаке)? Данный метод для каждой конкретной задачи...

Метод Монте-Карло (задача о ранце)
Как-то на 2-м или 3-м курсе универа мне выпало такое задание по контрольной работе. Естественно, что ту, контрольную я давно потерял, еще...

Задача методом динамического программирования
Добрый день. Передо мной стоит решение задачи методом динамического программирования (табличный метод). Суть задачи : На трех...

1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.01.2014, 05:48
foreverthing, функция Беллмана, насколько я помню, считается рекурсивно, а у вас в цикле. Конечно, любую рекурсию можно развернуть в цикл, но когда это делает не компилятор, а человек, высока вероятность ошибки. Поэтому советую выделить решение в отдельную функцию, и её рекуррентно вызывать. Если я правильно помню, сначала идет прямой ход, когда мы углубляемся и находим оптимальные решения, а затем обратный - когда определяем лямбды, а потом обратный - когда определяем оптимальные решения. Скину пожалуй старую домашку по ТОПу (а то буквально вчера, 9го числа, обменял учебник по ТОПу на учебник по статдинамике ), думаю, разберетесь. И немного теории.
Миниатюры
Задача о ранце. Для ее решения использовать метод динамического программирования   Задача о ранце. Для ее решения использовать метод динамического программирования  
Вложения
Тип файла: rar Лекции.rar (101.6 Кб, 28 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.01.2014, 05:48
Помогаю со студенческими работами здесь

Задача о точках и отрезках. Метод динамического программирования
Добрый вечер, помогите пожалуйста разработать алгоритм для решения задачи: На прямой задано N точек. Каждая точка должна быть соединена...

Метод динамического программирования для задачи поиска наибольшей чередующейся подпоследовательности
Задача о поиске наибольшей чередующейся подпоследовательности. Имеется последовательность. Необходимо определить самую длинную ...

Алгоритм решения задач динамического программирования
Здравствуйте, нужно решить следующую задачу посредством метода динамического программирования. Максимизировать z=(y1+2)^2+y2y3+(y4-5)^2...

Использовать симплекс-метод для решения следующей задачи
F=4x1+6x2-&gt;max 2x1+x2&lt;=64 x1+3x2&lt;=72 x1+x2&lt;=20 x1=&gt;0, x2=&gt;0.

Корректно ли использовать симплекс-метод для нахождения оптимального решения?
Здравствуйте. При решении следующей задачи: 3*x1+5*x2+4*x3-&gt;max при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru