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

Задача: Рюкзак

22.09.2020, 14:14. Показов 3727. Ответов 10

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста. Нужно написать код для данной задачи!
Задача: Рюкзак
Имя входного файла: input.txt
Имя выходного файла: output.txt
Ограничение по времени: 2 секунды
Ограничение по памяти: 256 мегабайт

Имеется ранец с максимальной грузоподъёмностью W и набор из n предметов. i–й предмет имеет стоимость ci и вес wi. Какие предметы можно положить в ранец, чтобы он не порвался, а суммарная стоимость выбранных предметов была бы максимальной?

Формат входного файла
В первой строке входного файла содержатся два числа W, n (1 ≤ W ≤ 10000,1 ≤ n ≤ 100),где W — вместимость рюкзака, а n — количество видов вещей. Затем идут n строк, в каждой по 2 целых положительных числа: вес и стоимость соответствующей вещи (каждое из чисел до 30000).

Формат выходного файла
Выходной файл должен содержать одно число — максимально возможный доход. Учтите, что вещи нельзя делить на части.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.09.2020, 14:14
Ответы с готовыми решениями:

Задача про рюкзак
Всем привет! Есть программа, которая решает задачу про рюкзак. Когда у меня количество...

Задача про рюкзак
Из заданных N предметов выбрать такие, чтобы суммарный вес был менее 30 кг, а стоимость -...

Задача о камнях (почти рюкзак) модификация)
из камней весом p1, p2 ... pn набрать вес W если это возможно вывести yes, если не - no, но есть...

Задача про рюкзак - ускорить работу программы
Вообщем есть алгоритм, который работает правильно за O(N*W), поэтому при больших значениях будет...

10
Just Do It!
3841 / 2288 / 636
Регистрация: 23.09.2014
Сообщений: 7,075
Записей в блоге: 2
22.09.2020, 14:36 2
WidDing,
Найдите максимальный вес золота, который можно унести в рюкзаке вместительностью S
смотрите моё решение, там на входе два массива:
первый массив - вес,
второй - стоимость.
0
0 / 0 / 0
Регистрация: 08.12.2019
Сообщений: 15
23.09.2020, 17:11  [ТС] 3
Извините, не понял как ваше решение подстроить под эту задачу, если не сложно, могли бы вы написать уже готовый код ?

Добавлено через 1 час 33 минуты
Извините, не понял как ваше решение подстроить под эту задачу, если не сложно, могли бы вы написать уже готовый код ?
0
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,967
23.09.2020, 17:51 4
Цитата Сообщение от WidDing Посмотреть сообщение
могли бы вы написать уже готовый код ?
0
0 / 0 / 0
Регистрация: 08.12.2019
Сообщений: 15
26.09.2020, 16:28  [ТС] 5
Здравствуйте, нужна помощь в задаче. Вот её условие

Имя входного файла: input.txt
Имя выходного файла: output.txt
Ограничение по времени: 2 секунды
Ограничение по памяти: 256 мегабайт

Имеется ранец с максимальной грузоподъёмностью W и набор из n предметов. i–й предмет имеет стоимость ci и вес wi. Какие предметы можно положить в ранец, чтобы он не порвался, а суммарная стоимость выбранных предметов была бы максимальной?

Формат входного файла
В первой строке входного файла содержатся два числа W, n (1 ≤ W ≤ 10000,1 ≤ n ≤ 100),где W — вместимость рюкзака, а n — количество видов вещей. Затем идут n строк, в каждой по 2 целых положительных числа: вес и стоимость соответствующей вещи (каждое из чисел до 30000).

Формат выходного файла
Выходной файл должен содержать одно число — максимально возможный доход. Учтите, что вещи нельзя делить на части.

Есть код, но ответ выдаёт неверный. Подскажите, пожалуйста, как исправить или, по возможности, предоставьте альтернативное решение данной задачи
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
#include <iostream>
#include <fstream>
 
using namespace std;
 
ifstream in("input.txt");
ofstream out("output.txt");
 
int  wts[100], cost[100];
int *x = new int[100000];
int SumC = 0, SumW = 0, Best = 0;
int N, W;
int val = 1, ak;
 
void print()
{ 
    int i;
 
    for( i = 1; i <= val; i++ )
    {
        SumW = SumW + wts[x[i]];
        SumC = SumC + cost[x[i]];
}
        if( SumW <= W && SumC > Best ) Best = SumC;
    }
    SumC = 0;
    SumW = 0;
}
 
void Generate( int n, int k )
{
    int i, j, p;
    for ( i = 1; i <= k; i++ ) x[i] = i;
    print();
    do 
    {
        p=0;
        for( i = k; i >= 1; i-- )
        if ( x[i] < n - k + i ) { p = i; break; }
        if ( p > 0 )
        {
            x[p]++;
            for( i = p + 1; i <= k; i++ ) x[i] = x[i-1] + 1;
            print();
        }
      }
      while( p > 0 );
}
 
int main()
{
    int i = 1;
 
    in >> N;
    in >> W;
    
    while( !in.eof() )
    {
        in >> wts[i];
        in >> cost[i];
        i++;
    }
 
    while( val <= N )
    {
        Generate( N, val );
        val++;
    }
 
    out << Best << endl; 
}
0
377 / 228 / 79
Регистрация: 24.11.2009
Сообщений: 695
29.09.2020, 15:45 6
Есть код, но ответ выдаёт неверный.
В смысле - не компилируется из-за неправильно расставленных скобок?
0
Just Do It!
3841 / 2288 / 636
Регистрация: 23.09.2014
Сообщений: 7,075
Записей в блоге: 2
29.09.2020, 16:22 7
Цитата Сообщение от WidDing Посмотреть сообщение
если не сложно, могли бы вы написать уже готовый код ?
легко,
но если вам не сложно, то дайте ссылку на ваш валидатор.
0
0 / 0 / 0
Регистрация: 08.12.2019
Сообщений: 15
29.09.2020, 18:52  [ТС] 8
Vladimir., компилируется, но выдает неверный ответ на первом тесте

Добавлено через 17 минут
XLAT, к сожалению валидатор даётся только для студенческих учётных записей
0
Just Do It!
3841 / 2288 / 636
Регистрация: 23.09.2014
Сообщений: 7,075
Записей в блоге: 2
29.09.2020, 19:06 9
Цитата Сообщение от WidDing Посмотреть сообщение
к сожалению валидатор даётся только для студенческих учётных записей
ладно, вот рискните:
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
///----------------------------------------------------------------------------|
/// Рюкзак.
///
/// Найдите максимальный вес золота, который можно унести в рюкзаке
/// вместительностью S, если есть N золотых слитков с заданными весами.
///
/// Входные данные:
///     ... засекречено.
///----------------------------------------------------------------------------:
#include <iostream>
#include <fstream>
#include <vector>
#include <limits>
 
using namespace std;
 
template<class T>
T maxx(T a, T b)
{   if(a > b) return a;
              return b;
}
 
unsigned foo(const std::vector<unsigned>& wts, 
             const std::vector<unsigned>& cost, unsigned W)
{   size_t n = wts.size();
    std::vector<std::vector<unsigned> > dp(W + 1);
    for (unsigned i = 0; i <= W; i++)
    {   dp[i].resize(n + 1);
        dp[i][0] = 0;
    }
    for (size_t i = 0; i <= n; i++)
    {   dp[0][i] = 0;
    }
    for     (size_t j = 1; j <= n; j++)
    {   for (size_t w = 1; w <= W; w++)
        {   if (wts[j-1] <= w)
            {   dp[w][j] = maxx<unsigned>
                    (dp[w][j - 1], dp[w - wts[j-1]][j - 1] + cost[j-1]);
            }
            else
            {   dp[w][j] = dp[w][j - 1];
            }
        }
    }
    return dp[W][n];
}
 
int main()
{   unsigned S;
    std::vector<unsigned> w;
    std::vector<unsigned> c;
    
    ifstream ifs("input.txt");
    ofstream ofs("output.txt");
    
    ifs >> S;
    ifs >> S;
    
    unsigned u;
    while (ifs >> u)
    {   w.push_back(u);
        ifs >> u;
        c.push_back(u);
    }
    ofs << foo(w, c, S);
}
0
377 / 228 / 79
Регистрация: 24.11.2009
Сообщений: 695
29.09.2020, 19:55 10
Цитата Сообщение от WidDing Посмотреть сообщение
компилируется, но выдает неверный ответ на первом тесте
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void print()
{ //функция начало
    int i;
 
    for( i = 1; i <= val; i++ )
    { //цикл начало
        SumW = SumW + wts[x[i]];
        SumC = SumC + cost[x[i]];
}//цикл конец
        if( SumW <= W && SumC > Best ) Best = SumC;
    }//функция конец
    SumC = 0; // скоуп фаила
    SumW = 0;
} // какая-то непонятная фигурная скобка. Компилятор должен ругаться.
0
0 / 0 / 0
Регистрация: 08.12.2019
Сообщений: 15
29.09.2020, 22:06  [ТС] 11
XLAT, неверный ответ на 1 тесте.

Первый тест.
Входные данные:
19 4
5 7
4 6
10 3
9 5
Правильный ответ:
18
0
29.09.2020, 22:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.09.2020, 22:06
Помогаю со студенческими работами здесь

непрерывный рюкзак
Первая строка содержит количество предметов 1≤n≤10^3 и вместимость рюкзака...

Сверхвозрастающий рюкзак
Всем привет. Помогите написать программу. Я разобрался в теории, а реализовать не могу. Пусть у...

Эвристика. Рюкзак Алладина.
Помогите с заданием пожалуйста. Разработать алгоритм и написать программу для задания Алладина:...

Жадный алгоритм (рюкзак)
слишком медленно, но верно работает программа. Помогите пожалуйста ускорить. (извиняюсь за транслит...

С++. Дан рюкзак с заданным объемом...
Кто сможет помогите с решением задачи на С++, буду очень благадарен. Задача: Дан рюкзак с...

Задача про воришку (рюкзак грабителя)
На с++ написать прогу Дано N предметов, W — вместимость рюкзака, w={w1,w2,…,wN} — соответствующий...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru