4 / 4 / 1
Регистрация: 11.12.2014
Сообщений: 26
1

Задача о ранце. Как сократить память?

17.05.2017, 04:02. Показов 1409. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток! Получил задание решить классическую задачу о ранце. Есть N предметов, у каждого предмета есть вес и цена, есть ранец, который выдерживает определённый вес. Задача унести как можно больше в денежном эквиваленте(вывести максимальную сумму денег). Задачу я решил, но в одном из 10 тестов на специальном сайте я получил "ошибку" Out of memory, что означает, что нужно как-то уменьшить колл-во памяти. Как я понял я могу использовать то, что мне не нужен список предметов, только суммарный вес, но как это реализовать я не знаю. Вот мой код, жду идеи, предложения

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CodEx;
 
namespace ConsoleApplication17
{
    class Program
    {
        static long max, count;
        static long[] vah;
        static long[] cen;
        static void Main(string[] args)
        {
            max = long.Parse(Console.ReadLine());
            count = long.Parse(Console.ReadLine());
            vah = new long[count];
            cen = new long[count];
            for (int i = 0; i < count; i++)
            {
                vah[i] = Reader.Console().Int();
                cen[i] = Reader.Console().Int();
            }
            long d = bag(vah, cen, max);
            Console.WriteLine(d);
            Console.ReadLine();
        }
 
//сама процедура поиска, vaha - массив весов, ceny массив цен, _max - максимальный вес, который выдерживает рюкзак
//вопрос в том, какая часть массива pl мне не нужна?
 
        static long bag(long[] vaha, long[] ceny, long _max)
        {
            long n = vaha.Length;
            long[,] pl = new long[_max+1, n+1];
            for (int j = 1; j <= n; j++)
            {
                for (int i = 1;i <= _max; i++)
                {
                    if (vaha[j-1] <= i)
                    {
                        pl[i, j] = Math.Max(pl[i, j-1], pl[i-vaha[j-1], j-1] + ceny[j-1]);
                    }
                    else
                    {
                        pl[i, j] = pl[i, j-1];
                    }
                }
            }
            return pl[_max, n];
        }
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.05.2017, 04:02
Ответы с готовыми решениями:

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

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

Задача о ранце
В связи с этими темами: Начало пути прогера...

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

4
C# = ♫♪♫♪♪♫
57 / 56 / 18
Регистрация: 02.08.2014
Сообщений: 283
17.05.2017, 05:57 2
C#
1
 static long bag(ref long[] vaha,ref long[] ceny,ref long _max)
0
Эксперт .NETАвтор FAQ
10409 / 5139 / 1824
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
17.05.2017, 08:26 3
DigitalGod,
Во-первых, зачем вам long? Может обойтись int?
Во-вторых, судя по вашему алгоритму, вы в цикле обращаетесь только к предыдущей строке массива pl (то есть к pl[i, j - 1]). Соотв, зачем вам хранить все предыдущие значения pl? Храните только последнюю строку:
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
        static long bag(long[] vaha, long[] ceny, long _max)
        {
            long n = vaha.Length;
            long[] pl = new long[_max + 1];
            long[] prev_pl = new long[_max + 1];
            for (int j = 1; j <= n; j++)
            {
                for (int i = 1; i <= _max; i++)
                {
                    if (vaha[j - 1] <= i)
                    {
                        pl[i] = Math.Max(prev_pl[i], prev_pl[i - vaha[j - 1]] + ceny[j - 1]);
                    }
                    else
                    {
                        pl[i] = prev_pl[i];
                    }
                }
                //swap
                var temp = pl;
                pl = prev_pl;
                prev_pl = temp;
            }
            return pl[_max];
        }
Sanek32, массив - ссылочный тип. При передаче в метод, копия массива не делается. Соотв и делать ref смысла нет.
2
4 / 4 / 1
Регистрация: 11.12.2014
Сообщений: 26
17.05.2017, 13:06  [ТС] 4
Storm23, long нужен был по условию.

Добавлено через 14 минут
Storm23, то, что вы написали показалось мне логичным, но оно не работает
На вот такой ввод программа выдаёт ответ 12, а должна 20
6
3
3 5
2 7
3 13
0
Эксперт .NETАвтор FAQ
10409 / 5139 / 1824
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
17.05.2017, 14:22 5
Лучший ответ Сообщение было отмечено DigitalGod как решение

Решение

Цитата Сообщение от DigitalGod Посмотреть сообщение
то, что вы написали показалось мне логичным, но оно не работает
На вот такой ввод программа выдаёт ответ 12, а должна 20
Там просто в последней строке нужно возвращать не pl, а prev_pl:
C#
1
return prev_pl[_max];
1
17.05.2017, 14:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.05.2017, 14:22
Помогаю со студенческими работами здесь

Задача о ранце
Всем доброго времени суток!))Очень нужна помощь...решаю задачу о ранце,метод-динамическое...

Задача о ранце
Здравствуйте, помогите,пожалуйста, реализовать алгоритм задачи о рюкзаке. на сайте видел некоторые...

Задача о ранце
Ребят помогите пожалуйста, надо создать программу, которая будет решать задачу о ранце. Программа...

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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