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

Задача о ранце

19.02.2014, 10:01. Показов 4091. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!))Очень нужна помощь...решаю задачу о ранце,метод-динамическое программирование.Нужен код-решение на С++..может кто помочь чем-нибудь,буду очень благодарна!!!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.02.2014, 10:01
Ответы с готовыми решениями:

Задача о ранце
В связи с этими темами: Начало пути прогера https://www.cyberforum.ru/cpp-beginners/thread926355.html Дано: Имеется человек с...

задача о ранце
Добрый все вечер!помоги пожалуйста решить задачу о рюкзаке на С++ разными методами-ветвей и границ,жадный...

Обратная задача о ранце (ДП)
Здравствуйте, необходимо решить типичную задачу о ранце, в двух видах. 1. Выбрать предметы с общей максимальной ценностью при весе не...

6
194 / 174 / 30
Регистрация: 10.07.2012
Сообщений: 800
19.02.2014, 12:47
например, эту задачу http://informatics.mccme.ru/mo... rid=3089#1
можно решать так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct thing {
    int wght, cost;
};
 
int main()
{
    int n, W;
    cin >> n >> W;
    vector<thing> t(n);
    vector<int> weight(W+1, -1);
    for(int i=0; i < n; ++i)
        cin >> t[i].wght;
    for(int i=0; i < n; ++i)
        cin >> t[i].cost;
    weight[0] = 0;
    for(int i=0; i < n; ++i)
        for(int j=W - t[i].wght; j >= 0; --j)
            if(weight[j] != -1)
                weight[j + t[i].wght] = max(weight[j + t[i].wght], weight[j] + t[i].cost);
    cout << *max_element(weight.begin(), weight.end()) << endl;
    return exit_scs;
}
1
1 / 1 / 0
Регистрация: 11.10.2013
Сообщений: 63
19.02.2014, 15:15  [ТС]
А методом динамического программирования как это сделать?

Добавлено через 2 часа 20 минут
Либо генетический
0
194 / 174 / 30
Регистрация: 10.07.2012
Сообщений: 800
19.02.2014, 15:20
мой код, конечно, не эталон, но тем не менее это динамика была)
0
1 / 1 / 0
Регистрация: 11.10.2013
Сообщений: 63
19.02.2014, 15:22  [ТС]
А,Спасибо А с генетическими когда-нибудь сталкивались?
0
194 / 174 / 30
Регистрация: 10.07.2012
Сообщений: 800
19.02.2014, 15:26
можно сказать, что нет. я почти на 100% уверен, что задача по ссылке грамотно написанным перебором будет решаться быстрее, чем какими-то модными методами.
0
1 / 1 / 0
Регистрация: 11.10.2013
Сообщений: 63
19.02.2014, 15:39  [ТС]
Есть вот такой код на Си генетический алгоритм решения задачи...Его нужно переделать на С++ и подправить немного...кто-нибудь сможет помочь?
Code
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
//Сам класс CDiophantine:
#include <stdlib.h>
#include <time.h>
#include <iostream>
#include <fstream>
#include <string>
 
#define MAXPOP  25
using namespace std;
class predmet
{
private:
    int w, p;
    string name;
public:
    predmet(){}
    void In(ifstream &ifst) 
    {
        ifst>>name;
        ifst>>w;
        ifst>>p;
    }
    void prin()
    {
        cout<<name<<" (Объем:"<<w<<" , Цена: "<<p<<" )\n";
    }
    int get_w(){return w;}
    int get_p(){return p;}
};
 
struct gene 
{
    int alleles[5];
    int fitness;
    float likelihood;
 
    // Проверка на равенство.
    int operator==(gene gn) 
    {
        for (int i=0;i<5;i++) 
        {
            if (gn.alleles[i] != alleles[i]) return false;
        }
 
        return true;
    }
};
 
class CDiophantine {
    public:
        CDiophantine(int, int, int, int, int, int);// Конструктор с коэффициентами A, B, C, D.
        int Solve();// Решить уравнение.
        
        //Возвращает данного гена.
        gene GetGene(int i) { return population[i];}
 
    protected:
        int ca,cb,cc,cd,ce;// The coefficients.
        int result;
        gene population[MAXPOP];// Population.
 
        int Fitness(gene &);// Fitness function.
        void GenerateLikelihoods(); // Generate likelihoods.
        float MultInv();// Creates the multiplicative inverse.
        int CreateFitnesses();
        void CreateNewPopulation();
        int GetIndex(float val);
 
        gene Breed(int p1, int p2);
 
};
void print(int* b)
{
    predmet A[100];
    ifstream ifst("input.txt");
    int n=0;
    for(;!ifst.eof();)
    {
        A[n].In(ifst);
        n++;
    }
    for(int i=0; i<n; i++) if(b[i]==1)
    A[i].prin();
}
CDiophantine::CDiophantine(int a, int b, int c, int d, int e, int res) : ca(a), cb(b), cc(c), cd(d), ce(e), result(res) {}
 
int CDiophantine::Solve() 
{
    int fitness = -1;
    // Генерация начальной популяции.
    srand((unsigned)time(NULL));
    for(int i=0;i<MAXPOP;i++)// Заполните населения с номерами между
    {
        for (int j=0;j<5;j++)// 0 and the result.
        {
            population[i].alleles[j] = rand() % 2;
            cout<<population[i].alleles[j];
        }
        cout<<endl;
    }
    if (fitness = CreateFitnesses()) 
    {
        return fitness;
    }
    int iterations = 0;// Вести учет итераций.
    while (fitness != 0 || iterations < 50)// Повторяйте, пока решение не найдено, или более 50 итераций.
    {
        GenerateLikelihoods();// Create the likelihoods.
        CreateNewPopulation();
        if (fitness = CreateFitnesses()) 
        {
            return fitness;
        }
        iterations++;
    }
    return -1;
}
 
int CDiophantine::Fitness(gene &gn)
{
    int total = ca * gn.alleles[0] + cb * gn.alleles[1] + cc * gn.alleles[2] + cd * gn.alleles[3]+ ce * gn.alleles[4];
 
    return gn.fitness = abs(total - result);
}
 
int CDiophantine::CreateFitnesses() 
{
    float avgfit = 0;
    int fitness = 0;
    for(int i=0;i<MAXPOP;i++) {
        fitness = Fitness(population[i]);
        avgfit += fitness;
        if (fitness == 0) {
            return i;
        }
    }
    return 0;
}
float CDiophantine::MultInv()
{
    float sum = 0;
 
    for(int i=0;i<MAXPOP;i++) {
        sum += 1/((float)population[i].fitness);
    }
 
    return sum;
}
 
void CDiophantine::GenerateLikelihoods() 
{
    float multinv = MultInv();
 
    float last = 0;
    for(int i=0;i<MAXPOP;i++) {
        population[i].likelihood = last = last + ((1/((float)population[i].fitness) / multinv) * 100);
    }
}
int CDiophantine::GetIndex(float val) {
    float last = 0;
    for(int i=0;i<MAXPOP;i++) {
        if (last <= val && val <= population[i].likelihood) return i;
        else last = population[i].likelihood;
    }
    
    return 5;
}
gene CDiophantine::Breed(int p1, int p2)
{
    int crossover = rand() % 4+1;// Создать точку пересечения (не первый).
    int first = rand() % 100;// Кто из родителей на первом месте?
 
    gene child = population[p1];// Child is all first parent initially.Ребенок все первый родитель на начальном этапе.
 
    int initial = 0, final = 4;// Кроссовер границ.
    if (first < 50) initial = crossover;    // If first parent first. start from crossover.  Если первый родитель в первую очередь. начать с кроссовером.
    else final = crossover+1;// Else end at crossover.
 
    for(int i=initial;i<final;i++)
    {// Crossover!
        child.alleles[i] = population[p2].alleles[i];
        if (rand() % 101 < 6) child.alleles[i] = rand() % (result + 1);
    }
 
    return child;// Return the kid...
}
 
void CDiophantine::CreateNewPopulation()
{
    gene temppop[MAXPOP];
 
    for(int i=0;i<MAXPOP;i++) 
    {
        int parent1 = 0, parent2 = 0, iterations = 0;
        while(parent1 == parent2 || population[parent1] == population[parent2])
        {
            parent1 = GetIndex((float)(rand() % 101));
            parent2 = GetIndex((float)(rand() % 101));
            if (++iterations > 25) break;
        }
    temppop[i] = Breed(parent1, parent2);// Create a child.
    }
 
    for(int i=0;i<MAXPOP;i++) population[i] = temppop[i];
}
void main() 
{
    setlocale(LC_ALL,"russian");
    ifstream ifst("input.txt");
    predmet A[100];
    int g,ans,P=0,n=0,m=0,W=0;
    int *a = new int[m]; //массив содержащий веса
    int *b = new int[n];
    for(;!ifst.eof();){A[m].In(ifst);m++;}
    for (int i=0;i<m;i++) a[i]=A[i].get_w();
    
    cout<<" Введите вес рюкзака:"<<endl;cin>>g;
    cout<<"\t** Полученные хромосомы:"<<endl;
   CDiophantine dp(a[0],a[1],a[2],a[3],a[4],g);
   ans = dp.Solve();
   if (ans == -1) 
   {
      cout << "No solution found." << endl;
   }
   else 
   {
      cout << "\t** Вес рюкзака равен "<<g<<" **"<<endl;
      cout << "\n Все предметы: \n"<<endl;
      ifstream ifst("input.txt");
      for(;!ifst.eof();)
      {
            A[n].In(ifst);
            A[n].prin();
            n++;
      }
      gene gn = dp.GetGene(ans);
      cout << "\n\t*** Наилучшая хромосома: ";
      cout << "( "<<gn.alleles[0] << " . ";
      cout << gn.alleles[1] << " . ";
      cout << gn.alleles[2] << " . ";
      cout << gn.alleles[3] << " . ";
      cout << gn.alleles[4] << " ) ***" << endl;
      for(int i=0;i<5;i++) b[i]=gn.alleles[i];
      cout<<"\n В рюкзаке присутствуют:\n\n";
      print(b);
      for (int i=0;i<n;i++) P+=A[i].get_p()*gn.alleles[i];
      cout<<"\n\t** Стоимость рюкзака равна "<<P<<" **"<<endl;
       cin.get();
       cin.get();
 
   }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.02.2014, 15:39
Помогаю со студенческими работами здесь

Задача о ранце, без ценностей
как решить задачу о ранце, без ценностей груза? То-есть дано число, набор цифр и операций. Нужно записать заданное число наименьшим...

Задача о ранце. Исправить ошибки в приведенном коде
Кароча, трабла с кодом в указанном месте. Дебаг мне не помог... Может кто-нибудь проверить почему прерывается? #include...

Задача о ранце. Как узнать какие предметы нужно положить?
Как можна узнать какие предмети входять в ранец ? #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;limits&gt; ...

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

Задача о ранце
Не могу понять как адаптировать следующую задачу под задачу о ранце. Количество внесенных купюр ограничено и необходимо выдать конкретную...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru