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

Заполнить рюкзак предметами, чтобы стоимость рюкзака была максимальной

13.02.2022, 18:55. Показов 1451. Ответов 14
Метки c++ (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер
Помогите пожалуйста найти ошибку в коде, не верно выводит ответ в консоль
Выводит: 1 4 5 6 7 / вес 40 сум 52
А должен: 1 2 4 5 6 / вес 45 сум 54

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
#include <iostream>
 
using namespace std;
 
int main()
{
    setlocale(LC_CTYPE, "rus");
    const int k = 9; // количество предметов
    const double W = 45; // вместимость рюкзака
    double w[k] = { 12,15,8,4,9,5,10,31,14 }; // масса
    double p[k] = { 11,10,6,16,10,7,8,10,8 }; // стоимость
    double mass[4][k]; //массив для расчетов
    double weight = 0; //суммарный вес
    double pay = 0; // суммарная стоимость
    for (int i = 0; i < k; i++)  //подсчет коэффициентов и заполнение строк массива
    {
        mass[0][i] = (p[i] / w[i]);
        mass[1][i] = w[i];
        mass[2][i] = p[i];
        mass[3][i] = i + 1;
 
    }
    for (int i = 0; i < k; i++) //распологаем в порядке убывания
    {
        for (int j = 0; j < k; j++)
        {
            double buffer;
            if (mass[0][i] > mass[0][j])
            {
                for (int z = 0; z < 4; z++)
                {
                    buffer = mass[z][i];
                    mass[z][i] = mass[z][j];
                    mass[z][j] = buffer;
                }
 
            }
        }
    }
    cout << "Подходящие предметы: ";
    for (int i = 0; i < k; i++)//выводим
    {
        weight += mass[1][i];
        if (weight <= W)
        {
            cout << mass[3][i] << " ";
            pay += mass[2][i];
        }
        else
        {
            weight -= mass[1][i];
        }
    }
    cout << endl << "Общий вес: " << weight << endl << "Сумма: " << pay << endl << endl;
    system("pause");
}
Добавлено через 1 час 46 минут
Никто не сможет помочь исправить?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.02.2022, 18:55
Ответы с готовыми решениями:

Задача о рюкзаке: упаковать рюкзак так, чтобы общая ценность предметов была наибольшей и вес не превышал объем рюкзака
«ЗАДАЧА О РЮКЗАКЕ» Путешественник собрался в поход. Перед ним 5 предметов, для каждого известна ценность (стоимость) (4, 1, 8, 7, 1) и...

Какие предметы надо положить в рюкзак, чтобы общий вес не превышал h, а стоимость была максимальна? (нужны комментарии)
В файле содержится m+1 строк. Первая строка - целое число (параметр h, устанавливающий максимальный вес), каждая строка кроме первой -...

Какие стулья и в каком количестве выпускать, чтобы стоимость продукции была максимальной?
:wall:Фабрика выпускает стулья двух видов. На изготовление одного стула первого типа, стоящего с1, расходуется m1 метра досок, n1 м2...

14
Злостный нарушитель
 Аватар для Verevkin
10260 / 5684 / 1265
Регистрация: 12.03.2015
Сообщений: 26,364
13.02.2022, 18:57
Цитата Сообщение от maxim_lebowskiy Посмотреть сообщение
Никто не сможет помочь исправить?
Никто не хочет угадывать условие задачи.

0
0 / 0 / 0
Регистрация: 09.07.2021
Сообщений: 78
13.02.2022, 19:00  [ТС]
Условие: нужно заполнить рюкзак предметами, чтобы стоимость рюкзака была максимальной
0
0 / 0 / 0
Регистрация: 09.07.2021
Сообщений: 78
14.02.2022, 11:28  [ТС]
Задача актуальна.
0
2393 / 1914 / 763
Регистрация: 27.07.2012
Сообщений: 5,559
14.02.2022, 11:30
Цитата Сообщение от maxim_lebowskiy Посмотреть сообщение
Условие: нужно заполнить рюкзак предметами, чтобы стоимость рюкзака была максимальной
Я бы все имеющиеся впихнул, шоб наверняка.
0
0 / 0 / 0
Регистрация: 09.07.2021
Сообщений: 78
14.02.2022, 11:33  [ТС]
Действует ограничение:

C++
1
const double W = 45; // вместимость рюкзака
0
2393 / 1914 / 763
Регистрация: 27.07.2012
Сообщений: 5,559
14.02.2022, 11:50
Вы структуры уже проходили?
0
0 / 0 / 0
Регистрация: 09.07.2021
Сообщений: 78
14.02.2022, 12:00  [ТС]
Нет
0
2393 / 1914 / 763
Регистрация: 27.07.2012
Сообщений: 5,559
14.02.2022, 12:21
Цитата Сообщение от maxim_lebowskiy Посмотреть сообщение
Нет
Ясно. Просто был непонятен этот огород с доп. массивом.

Ошибка, видимо, где-то в критериях выбора.
0
0 / 0 / 0
Регистрация: 09.07.2021
Сообщений: 78
14.02.2022, 12:34  [ТС]
Ну, если уж вы не смогли найти, то я подавно не найду)
0
2393 / 1914 / 763
Регистрация: 27.07.2012
Сообщений: 5,559
14.02.2022, 12:39
Цитата Сообщение от maxim_lebowskiy Посмотреть сообщение
Ну, если уж вы не смогли найти, то я подавно не найду)
Не в этом дело. Вы делаете выбор по соотношению цена / вес. По этому алгоритму у вас выводит всё так. Другое дело, что критерий выбора должен быть сложнее, так как текущий не даёт желаемого результата.

Т.е. ошибка не в коде, а в самой идее так решать задачу.
0
 Аватар для YUEN HOIFEF
252 / 185 / 47
Регистрация: 31.01.2021
Сообщений: 934
14.02.2022, 12:48
Этот алгоритм применяют при первом знакомстве с данной задачей. Конечно же это убожество просто чтоб стала понятно что предметы влазют не все, что нужны и надо что-то поинтересней.
А конкретно в этом случае могу посоветовать maxim_lebowskiy после сортировки вывести весь массив с коэффициэнтами. Потому-что если правильно отсортирован то и вывод будет правильный. Алгоритм примитивный ведь.
0
0 / 0 / 0
Регистрация: 09.07.2021
Сообщений: 78
17.02.2022, 13:50  [ТС]
Всем снова привет. Хотел бы попросить вас помощи все-таки допилить свою задачку.
Знакомый скинул код решения, теперь задачка считает все корректно, но мне требуется, чтобы в консоль помимо максимальной стоимости также выводился максимальный вес предметов, которые положили, а также сами номера предметов (как в моем первом варианте). Буду благодарен за помощь.

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
#include<stdio.h>
#include<stdlib.h>
 
typedef struct items
{
    char name[20];
    unsigned int weight;
    float profit;
};
 
float max( float a, float b )
{
    return ((a>b)?a:b);
}
 
//Function to solve knapsack
float knapsack(unsigned int n, struct items object[], unsigned int capacity)
{
    float table[n+1][capacity+1];
    
    for(unsigned int i=0; i<=n; i++)
    {
        for(unsigned int j=0; j<=capacity; j++)     
        {       
            if( i==0 || j==0 )
                table[i][j] = 0.0;
            else if( object[i-1].weight <= j )
                table[i][j] = max( (object[i-1].profit + table[i-1][j-object[i-1].weight]), table[i-1][j] );
            else
                table[i][j] = table[i-1][j];
        }
    }
    
    //Printing table
    printf("Printing profit table\n");
    for(unsigned int i=0; i<=n; i++)
    {
        for(unsigned int j=0; j<=capacity; j++)     
            printf("%.1f\t",table[i][j]);
        printf("\n");
    }
    
    return table[n][capacity];
}
 
int main(void)
{
    //Input for Bag capacity
    unsigned int capacity;
    printf("Enter bag's capacity: ");
    scanf("%u",&capacity);
 
    //Input for number of items
    unsigned int n;
    printf("Enter total number of items: ");
    scanf("%d",&n);
 
    struct items item[n];
    
    //Input object details from user 
    printf("Enter Asked Details:\n");   
    for(unsigned int i=0; i<n; i++)
    {
        printf("==========Item No. %d ==========\n",i+1);
        printf("Item Name: ");
        scanf("%s",item[i].name);
        printf("Weight: ");
        scanf("%u",&item[i].weight);
        printf("Profit: ");
        scanf("%f",&item[i].profit);
    }
 
    //Solving knapsack problem
    float max_profit = knapsack(n, item, capacity);
    
    printf("Maximum Profit is %.2f.",max_profit);
 
    return 0;
}
0
 Аватар для YUEN HOIFEF
252 / 185 / 47
Регистрация: 31.01.2021
Сообщений: 934
17.02.2022, 13:58
maxim_lebowskiy
Не позорь рюкзак!
0
0 / 0 / 0
Регистрация: 09.07.2021
Сообщений: 78
20.02.2022, 18:43  [ТС]
Еще актуально, поможет кто дополнить программу?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.02.2022, 18:43
Помогаю со студенческими работами здесь

Найти такой план выпуска продукции, чтобы общая стоимость была максимальной...
нужно реализовать задачу в Windows Form c# В распоряжении фабрики имеется определенное количество ресурсов: рабочая сила (80ч/дней),...

В самолет требуется погрузить n видов предметов, Чтобы их суммарная стоимость была максимальной
В самолет требуется погрузить n видов предметов, Чтобы их суммарная стоимость была максимальной. Известна грузоподъемность самолета, вес и...

Набить рюкзак этими предметами так, чтобы их общий вес был не менее m и при этом был минимальным
Для решения одного задания мне нужно решить следующую подзадачу. Суть такова: Есть рюкзак бесконечной вместимости и n предметов. Нужно...

Структуры. Определить число поездок, в которых стоимость перевезенного груза была максимальной
Известен вес и стоимость одной тонны груза, перевезенного самосвалом в каждой из десяти поездок. Определить число поездок, в которых...

Привести примеры ограниченного, неограниченного, многомерного, рюкзака с мультивыбором и мультипликативного рюкзак
Всем привет:)Ребят кто-нибудь может помочь с примерами.нужно привести примеры ограниченного рюкзака,неограниченного,многомерного,рюкзак с...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru