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

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

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

Студворк — интернет-сервис помощи студентам
На вход подаётся число T и какое-то количество пар целых чисел.
Необходимо взять несколько пар так, что бы сумма первых элементов этих пар была не меньше T, а сумма вторых элементов была наименьшей из возможных.
Скорее всего необходимо использовать BST. Подскажите, пожалуйста, как это сделать. Интересут принцип.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.11.2016, 17:09
Ответы с готовыми решениями:

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

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

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

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

Решение

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

Добавлено через 6 минут
Ответ не нужен.
0
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,878
02.11.2016, 11:22
Если сумма всех первых элементов не сильно 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
 Аватар для oobarbazanoo
7 / 30 / 9
Регистрация: 13.05.2015
Сообщений: 1,835
02.11.2016, 14:00  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
r::rs
зачем здесь ссылка на метод?
0
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,878
02.11.2016, 15:04
Цитата Сообщение от 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
 Аватар для oobarbazanoo
7 / 30 / 9
Регистрация: 13.05.2015
Сообщений: 1,835
05.11.2016, 21:29  [ТС]
Shamil1, извиняюсь, но мне не понятно что Вы написали. Не могли бы Вы это на Java написать, пожалуйста?
0
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,878
05.11.2016, 23:42
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.11.2016, 23:42
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru