Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
7 / 30 / 9
Регистрация: 13.05.2015
Сообщений: 1,835
1

Выбор нужных пар целых чисел

01.11.2016, 17:09. Показов 1705. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
На вход подаётся число T и какое-то количество пар целых чисел.
Необходимо взять несколько пар так, что бы сумма первых элементов этих пар была не меньше T, а сумма вторых элементов была наименьшей из возможных.
Скорее всего необходимо использовать BST. Подскажите, пожалуйста, как это сделать. Интересут принцип.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.11.2016, 17:09
Ответы с готовыми решениями:

Записать в массив N целых чисел. Подсчитать количество пар противоположных чисел среди компонентов этого массива
Записать в массив N целых чисел. Подсчитать количество пар противоположных чисел среди компонентов...

Вывести количество пар целых чисел, удовлетворяющих условию
Входные данные В единственной строке входных данных находятся два целых числа n и m...

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

В неубывающей последовательности целых чисел найти количество пар чисел с заданной разностью "D"
Помогите пожалуйста оптимизировать алгоритм, тут приведен простой перебор и на большом тесте...

7
Модератор
Эксперт функциональных языков программирования
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,469
01.11.2016, 17:32 2
Лучший ответ Сообщение было отмечено oobarbazanoo как решение

Решение

Задача о рюкзаке. Только вместо максимума надо искать минимум.
1
7 / 30 / 9
Регистрация: 13.05.2015
Сообщений: 1,835
01.11.2016, 18:29  [ТС] 3
Трудно понять алгоритм решения. Объясните, пожалуйста, если можете. Как решать мой случай задачи.

Добавлено через 6 минут
Ответ не нужен.
0
Модератор
Эксперт функциональных языков программирования
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,469
02.11.2016, 11:22 4
Если сумма всех первых элементов не сильно S отличается о Т, то можно использовать программу для решения задачи о рюкзаке 0-1. Нужно максимизировать цену (второй элемент пары) вещей в рюкзаке вместимостью (S - T). Те вещи, которые не попали в рюкзак, и будут решением.

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

Добавлено через 1 час 36 минут
F#
1
2
3
4
5
6
7
8
9
10
let knacksack items t =
    let rec iter (p',ss') ss w p rr =
        match rr with
        | _ when p > p'    -> (p',ss')
        | _ when w >= t    -> (p,ss)
        | []               -> (p',ss')
        | r::rs            ->  let x1 = iter (p',ss') (r::ss) (w + fst r) (p + snd r) rs 
                               let x2 = iter x1 ss w p rs 
                               min x1 x2
    iter (Int32.MaxValue,[]) [] 0 0 (List.sortBy (fun (w,p) -> (double p)/(double w)) items)
(надеюсь, я не ошибся с отсечением)
1
7 / 30 / 9
Регистрация: 13.05.2015
Сообщений: 1,835
02.11.2016, 14:00  [ТС] 5
Цитата Сообщение от Shamil1 Посмотреть сообщение
r::rs
зачем здесь ссылка на метод?
0
Модератор
Эксперт функциональных языков программирования
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,469
02.11.2016, 15:04 6
Цитата Сообщение от oobarbazanoo Посмотреть сообщение
зачем здесь ссылка на метод?
Это не ссылка на метод, а сопоставление с образцом.
Список rr можно представить в виде головы r, добавленной в начало хвоста rs.

Добавлено через 40 минут
Переписал, чтобы было понятней
F#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let knacksack items t =
    let rec iter bestItems bestPrice currItems currWeight currPrice restItems =
        match restItems with
        | _ when currPrice > bestPrice    -> (bestPrice, bestItems) // отсекаем ветвь
        | _ when currWeight >= t          -> (currPrice, currItems) // улучшили решение
        | []                              -> (bestPrice, bestItems) // ветвь без решения
        | head::tail                      -> 
            // лучшее решение, содержащее head
            let newItems, newWeight, newPrice = (head::currItems), (currWeight + fst head), (currPrice + snd head)
            let x1 = iter bestItems bestPrice newItems newWeight newPrice tail 
            // лучшее решение, не содержащее head
            let x2 = iter (snd x1) (fst x1) currItems currWeight currPrice tail 
            min x1 x2 
    // сортируем список пар по возрастанию цены за единицу веса, чтобы первое "жадное" решение позволило отсечь больше ветвей
    iter [] (Int32.MaxValue) [] 0 0 (List.sortBy (fun (w,p) -> (double p)/(double w)) items)
Для представления задачи в виде двух подзадач меньшего размера используем факт, что для любого элемента выполняется одно из двух: лучшее решение либо содержит его, либо не содержит его.

Добавлено через 10 минут
исправил опечатку во втором варианте
1
7 / 30 / 9
Регистрация: 13.05.2015
Сообщений: 1,835
05.11.2016, 21:29  [ТС] 7
Shamil1, извиняюсь, но мне не понятно что Вы написали. Не могли бы Вы это на Java написать, пожалуйста?
0
Модератор
Эксперт функциональных языков программирования
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,469
05.11.2016, 23:42 8
Цитата Сообщение от oobarbazanoo Посмотреть сообщение
Не могли бы Вы это на Java написать, пожалуйста?
На java то же самое, только в 5 раз длиннее, так как там нет классов (например, для кортежей), которые в других языках поставляются "из коробки". И ещё, писать все эти классы - нудное занятие.

Добавлено через 36 минут
Вот, например, на C#.
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
Tuple<int,fnc::List<Tuple<int,int>>> iter(int reqWeight, fnc::List<Tuple<int,int>> bestItems, int bestPrice, fnc::List<Tuple<int,int>> currItems, int currWeight, int currPrice, fnc::List<Tuple<int,int>> restItems)
{
    if(currPrice >= bestPrice) 
        return Tuple.Create(bestPrice, bestItems);
    
    if(currWeight >= reqWeight)
        return Tuple.Create(currPrice, currItems);
 
    if (restItems.IsEmpty)
        return Tuple.Create(bestPrice, bestItems);
        
    var head = restItems.Head;
    var tail = restItems.Tail;
 
    var newItems = currItems.Cons(head);
    var newWeight = currWeight + head.Item1;
    var newPrice = currPrice + head.Item2;
    var x1 = iter (reqWeight, bestItems, bestPrice, newItems, newWeight, newPrice, tail);
 
    var x2 = iter (reqWeight, x1.Item2, x1.Item1, currItems, currWeight, currPrice, tail);
    
    return x1.Item1 < x2.Item1 ? x1 : x2;
}
 
Tuple<int, fnc::List<Tuple<int, int>>> knacksack(fnc::List<Tuple<int, int>> items, int reqWeight)
{
    return iter(reqWeight, fnc::List<Tuple<int, int>>.Empty, Int32.MaxValue, fnc::List<Tuple<int, int>>.Empty, 0, 0,  new fnc::List<Tuple<int, int>>(items.OrderBy(x => (double)x.Item2/x.Item1)) );
}
Неужели так понятней?

з.ы. На java точно так же, то нужно будет самому написать классы для кортежей (Tuple) и односвязного списка (fnc::List).
1
05.11.2016, 23:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.11.2016, 23:42
Помогаю со студенческими работами здесь

Найдите количество пар целых чисел, для которых выполнено равенство
Найдите количество пар целых чисел, для которых выполнено равенство {n}^{2}+{2}^{2014}={m}^{2} Я...

Описать класс Vector как вектор из пяти пар двузначных целых чисел
Описать класс Vector как вектор из 5 пар двузначных целых чисел. Определить оператор &gt; и оператор...

Исключение повторов комбинаций среди множества пар целых чисел с помощью multimap
Здравствуйте. Есть задача &quot;Используйте шаблон multimap для исключения повторов комбинаций среди...

По исходному списку целых чисел создать описание мультимножества в виде списка пар
По исходному списку целых чисел создать описание мультимножества в виде списка пар, в которых...


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

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