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

Распределить камни в две кучи так, чтобы модуль разности весов этих двух куч был минимальным

14.11.2014, 16:21. Показов 8615. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Требуется программу, которая распределит камни в две кучи так, чтобы модуль разности весов этих двух куч был минимальным. Под весом кучи следует понимать суммарный вес камней в ней. камней от 1 до 100, вес от 1 до 100000. Мне сказали, что эта задача решается с помощью задачи о рюкзаке. Помогите пожалуйста разобраться!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.11.2014, 16:21
Ответы с готовыми решениями:

Распределить камни в две кучи так, чтобы разность весов этих двух куч была минимальной
Ограничение времени: 1.0 секунды Ограничение памяти: 64 МБ У вас есть несколько камней известного веса w1, …, wn. Напишите...

Распределить камни в две кучи так, что разность весов этих двух куч будет минимальной (C# -> C++)
Задача: Ограничение времени: 1.0 секунды Ограничение памяти: 64 МБ У вас есть несколько камней известного веса w1, …, wn....

Распределить камни в две кучи так, чтобы разность весов этих двух куч была минимальной
Ограничение времени: 1.0 секунды Ограничение памяти: 64 МБ У вас есть несколько камней известного веса w1, …, wn. Напишите...

28
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
14.11.2014, 16:54
1) Запускаешь рюкзак
2) Смотришь, какие веса W можно получить в одной куче
3) Из всех таких весов W смотришь, какой вес Q будет в другой куче (т.е. общий_вес - W)
4) Выбираешь минимальное значение |W-Q|
1
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
14.11.2014, 16:54
Diggiti, а ты задачу о рюкзаке решать умеешь?
0
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 16
14.11.2014, 17:07  [ТС]
знаю только только алгоритм, проблемы с написанием кода
0
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
14.11.2014, 18:03
Стопудово решение неправильно, я во всяком случае не удивлюсь. Если неправильно, укажите правильный алгоритм, а то тоже стало интересно.
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
 
int main()
{
    srand(time(0));
    const int size = 3 + rand() % 100;
    int *stones = new int[size];
    for( int i = 0; i < size; i++ )
        stones[i] = 1 + rand() % 100000;
    int firstHeap = stones[0], secondHeap = stones[1];
    for(int i = 2; i < size; i++)
    {
        if( firstHeap >= secondHeap )
            secondHeap += stones[i];
        else
            firstHeap += stones[i];
        std::cout << "First heap: " << firstHeap << ".\nSecond heap: " << secondHeap << "." << std::endl;
    }
 
    int diff = firstHeap - secondHeap;
    std::cout << "The difference between heaps is: " << std::abs( diff ) << std::endl;
    system("pause");
    return 0;
}
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
14.11.2014, 18:16
tnk500, решение конечно неверное. валится например таким тестом.

4 камня и их веса 1 4 2 3

твое решение возьмет в 1 кучку сумму 6 и во 2-ю кучку сумму 4. ответ 5 5
0
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 16
14.11.2014, 18:22  [ТС]
SlavaSSU, А можете, правильно решение сказать, пожалуйста? просто давно бьюсь над этой задачей и безуспешно
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
14.11.2014, 18:35
Diggiti, пришлось немоног поизвращаться т.к. числа достаточно большие. не гаранитирую что это верно(хотя очень надеюсь)))


C++ (Qt)
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
#include <iostream>
#include <set>
#include <cassert>
 
using namespace std;
 
const int INF = (int)(1e9);
 
const int N = 111;
 
int a[N];
bool used[N * int(1e5 + 1)];
 
int main()
{
    int n;
    cin >> n;
 
    int s = 0;
    for(int i = 0; i < n; i++)
        cin >> a[i], s += a[i];
 
    set<int> dp;
    dp.insert(0);
    used[0] = true;
 
    for(int i = 0; i < n; i++)
    {
        set<int> ndp = dp;
 
        for(set<int>::iterator it = dp.begin(); it != dp.end(); it++)
        {
            int val = *it;
            val += a[i];
            if(!used[val])
            {
                used[val] = true;
                ndp.insert(val);
            }
        }
 
        dp = ndp;
    }
 
    int ans = INF;
    int s1 = -1, s2 = -1;
 
    for(int i = 0; i < N * (int)(1e5 + 1); i++)
    {
        if(used[i])
        {
            int dif = abs(i - (s - i));
 
            if(dif < ans)
            {
                ans = dif;
                s1 = i;
                s2 = s - i;
            }
        }
    }
 
    assert(s1 + s2 == s);
 
    cout << s1 << ' ' << s2 << endl;
 
    return 0;
}
0
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 16
14.11.2014, 18:42  [ТС]
SlavaSSU, превышено время ожидания пишет)) и по памяти много выходит
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
14.11.2014, 18:44
Diggiti, скажи сайт.
превышено время ожидания? О.о?
0
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 16
14.11.2014, 18:46  [ТС]
SlavaSSU, давай скину в скайп/почта/контакт
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
14.11.2014, 18:47
Diggiti, тут есть лс.
0
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 16
14.11.2014, 18:52  [ТС]
SlavaSSU, где?) не могу понять никак
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
14.11.2014, 19:04
Diggiti, да кидай ссюда ссылку какая разница
0
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 16
14.11.2014, 19:11  [ТС]
SlavaSSU, http://acm.petrsu.ru/fsystem
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
14.11.2014, 19:25
Diggiti, как выбрать контест?

нжимаю на "выьерите контест" - открывается пустое окно. или это при входе в систему надо указывать название контеста?

Добавлено через 5 минут
Diggiti, если эта задача есть в архиве задач, то скажи ее номер
0
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 16
14.11.2014, 19:26  [ТС]
SlavaSSU, http://acm.petrsu.ru/site/contest/combalgs_archive ищи АРхив задач , комбинаторные алгоритмы
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
14.11.2014, 19:30
Diggiti, скажи название задачи, я не могу ее найти в разделе комбинаторные алгоритмы

нашел. "время собирать камни".!
0
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 16
14.11.2014, 19:32  [ТС]
SlavaSSU, время собирать камни
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
14.11.2014, 19:38
Diggiti, вот прошло. правда ты в условии накосячил. там числа до 10000. можно написать решение проще. и ты не сказал что там файловый ввод вывод.
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
#include <iostream>
#include <set>
#include <cassert>
 
using namespace std;
 
const int INF = (int)(1e9);
 
const int N = 111;
 
int a[N];
bool used[N * int(1e4 + 1)];
 
int main()
{
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
 
    int n;
    cin >> n;
 
    int s = 0;
    for(int i = 0; i < n; i++)
        cin >> a[i], s += a[i];
 
    set<int> dp;
    dp.insert(0);
    used[0] = true;
 
    for(int i = 0; i < n; i++)
    {
        set<int> ndp;
 
        for(set<int>::iterator it = dp.begin(); it != dp.end(); it++)
        {
            int val = *it;
            val += a[i];
            if(!used[val])
            {
                used[val] = true;
                ndp.insert(val);
            }
        }
 
        for(set<int>::iterator it = ndp.begin(); it != ndp.end(); it++)
            dp.insert(*it);
    }
 
    int ans = INF;
    int s1 = -1, s2 = -1;
 
    for(int i = 0; i < N * (int)(1e5 + 1); i++)
    {
        if(used[i])
        {
            int dif = abs(i - (s - i));
 
            if(dif < ans)
            {
                ans = dif;
                s1 = i;
                s2 = s - i;
            }
        }
    }
 
    assert(s1 + s2 == s);
 
    cerr << s1 << ' ' << s2 << endl;
    cout << ans << endl;
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.11.2014, 19:38
Помогаю со студенческими работами здесь

Напишите программу, которая распределит камни в две кучи так, что разность весов этих двух куч будет минимальной
Здравствуйте! Пытаюсь решить задачу http://acm.timus.ru/problem.aspx?space=1&amp;num=1005 мне нужно чтобы программа была быстрой и...

Написать программу для раздела этих камней на две кучи так, чтобы разность весов этих куч была бы минимальной
У нас имеется N камней с весами w1, w2, w3,…, wn. Написать программу, которая распределит эти камни на две кучи так, чтобы разность весов...

Разложить камни в 2 кучи так, что разность весов двух куч была минимальной
Разложить камни в 2 кучи так, что разность весов двух куч была минимальной. Вот мой вариант, однако, неправильный: type list = array...

Необходимо разбить камни на две кучи таким образом, чтобы веса куч отличались не более чем в 1.5 раза.
Имеется N камней веса А1,А2,...,АN. Необходимо разбить их на две кучи таким образом, чтобы веса куч отличались не более чем в 1.5 раза....

Разбить камни на две кучи так, чтобы вес одной кучи не превышал веса другой более критической массы
Здраствуйте,уважаемые програмисты!Проблемы с задачкой Условие:Есть куча камней,каждый камень имеет вес,есть критическая масса.Нужно...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru