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

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

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

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста. Нужно написать код для данной задачи!
Задача: Рюкзак
Имя входного файла: 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.09.2020, 14:14
Ответы с готовыми решениями:

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

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

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

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

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

Имя входного файла: 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
Есть код, но ответ выдаёт неверный.
В смысле - не компилируется из-за неправильно расставленных скобок?
0
Just Do It!
 Аватар для XLAT
4211 / 2668 / 655
Регистрация: 23.09.2014
Сообщений: 9,082
Записей в блоге: 3
29.09.2020, 16:22
Цитата Сообщение от WidDing Посмотреть сообщение
если не сложно, могли бы вы написать уже готовый код ?
легко,
но если вам не сложно, то дайте ссылку на ваш валидатор.
0
0 / 0 / 0
Регистрация: 08.12.2019
Сообщений: 15
29.09.2020, 18:52  [ТС]
Vladimir., компилируется, но выдает неверный ответ на первом тесте

Добавлено через 17 минут
XLAT, к сожалению валидатор даётся только для студенческих учётных записей
0
Just Do It!
 Аватар для XLAT
4211 / 2668 / 655
Регистрация: 23.09.2014
Сообщений: 9,082
Записей в блоге: 3
29.09.2020, 19:06
Цитата Сообщение от 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
Цитата Сообщение от 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  [ТС]
XLAT, неверный ответ на 1 тесте.

Первый тест.
Входные данные:
19 4
5 7
4 6
10 3
9 5
Правильный ответ:
18
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.09.2020, 22:06
Помогаю со студенческими работами здесь

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

непрерывный рюкзак
Первая строка содержит количество предметов 1≤n≤10^3 и вместимость рюкзака 0≤W≤2⋅10^6. Каждая из следующих n строк задаёт стоимость...

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru