Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
27 / 27 / 6
Регистрация: 04.04.2013
Сообщений: 137
Записей в блоге: 1
1

Задача о заполнении сумки

11.01.2015, 13:17. Показов 1664. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день форумчане, недавно наткнулся на данную задачу:

Имеется N слитков массами m и стоимостью p. Нужно наполнить сумку (массой M) слитками, с условием что вся сумка будет заполнена и стоимость сумки будет равна K.

Если это возможно вывести "YES". Какой алгоритм использовать?
Заранее благодарю за помощь!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.01.2015, 13:17
Ответы с готовыми решениями:

Задача о заполнении бочек жидкостью
На заводе в ряд стоят n бочек, занумерованные от 1 до n. Бочка с номером i вмещает ai нанолитров...

Сложить камни в сумки [SWI Prolog]
доброе время суток...помогите решить задачу на прологе. Цель задачи сложить камни в сумки. Дано:...

Выкройки сумки для документов на шею и на пояс
Помогите создать выкройку сумки для документов на пояс. Примеры:

В чём носить ноутбук, если нет специальной сумки для него?
В чём носите вы в таких случаях?

23
1 / 1 / 1
Регистрация: 11.01.2015
Сообщений: 26
11.01.2015, 13:37 2
Не совсем понял условие задачи.
Цитата Сообщение от Rasul96 Посмотреть сообщение
сумку (массой M)
Имеется ввиду вместимость сумки?
Цитата Сообщение от Rasul96 Посмотреть сообщение
вся сумка будет заполнена
Без остатка свободного места в сумке или в ней будет максимум слитков? Допустим, m=3, M=10. Вся сумка - это 10/10 (условие не выполняется) или 9/10 (3 слитка)?
0
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,037
11.01.2015, 13:39 3
Поищи по фразе "задача о рюкзаке".
0
27 / 27 / 6
Регистрация: 04.04.2013
Сообщений: 137
Записей в блоге: 1
11.01.2015, 13:48  [ТС] 4
Да вместимость сумки.
Без остатка свободного места. То есть если вместимость сумки 10, то нужно подобрать слитки так чтобы они суммарно весили именно 10.

Добавлено через 1 минуту
wingblack, я знаю задачу о рюкзаке, но эта задача сформулирована немного по другому и я не могу додуматься.
0
1 / 1 / 1
Регистрация: 11.01.2015
Сообщений: 26
11.01.2015, 13:56 5
В таком случае Вам сначала нужно проверить, кратна ли вместимость сумки весу слитка.
Если кратна - определить, во сколько раз.
Умножить цену слитка на полученное строчкой выше число.
Если произведение >= К, то напечатать Yes.
0
27 / 27 / 6
Регистрация: 04.04.2013
Сообщений: 137
Записей в блоге: 1
11.01.2015, 13:59  [ТС] 6
Киберпанк, Так это же не линейная программа. Здесь проходит метод динамического программирования. Но какой именно алгоритм, я и хочу понять.
0
1 / 1 / 1
Регистрация: 11.01.2015
Сообщений: 26
11.01.2015, 14:35 7
Цитата Сообщение от Rasul96 Посмотреть сообщение
метод динамического программирования
Таких умных слов я не знаю, но искренне не понимаю, зачем усложнять себе жизнь.
Программа решается в 9 строчек, если отбросить заполнение.
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
#include <stdio.h>
void main()
{
//Объявление переменных
    int nIng,nBag,nMass,nTemp;
    float fPrice,fSummPrice,fSecTemp;
//Заполнение
    printf("Enter quantity of ingots: ");
    scanf("%d",&nIng);
    printf("Enter ingot mass: ");
    scanf("%d",&nMass);
    printf("Enter ingot price:");
    scanf("%f",&fPrice);
    printf("Capacity of a bag: ");
    scanf("%d",&nBag);
    printf("Summary price: ");
    scanf("%f",&fSummPrice);
//Проверка условий
//Кратность
    if(nBag%nMass==0) {
        nTemp=nBag/nMass;
        if(nTemp<nIng) fSecTemp=fPrice*nTemp;
        else fSecTemp=fPrice*nIng;
//Cуммарная цена
        if(fSecTemp>=fSummPrice) printf("YES\n");
        else printf("NO\n");}
    else printf("NO\n");
}
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
11.01.2015, 14:45 8
скажи ограничения
0
27 / 27 / 6
Регистрация: 04.04.2013
Сообщений: 137
Записей в блоге: 1
11.01.2015, 15:58  [ТС] 9
Киберпанк, Так ведь мы же не знаем не знаем сколько слитков (слитков N'ое количество). А в вашем коде вы вводите только один слиток.
SlavaSSU, ограничения: N < 20; m, p, M, K < 100.
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
11.01.2015, 16:01 10
Rasul96, каждый предмет можно брать неограниченное количесвто раз? если каждый предмет только 1 раз можно взять, то перебор зайдет.
0
27 / 27 / 6
Регистрация: 04.04.2013
Сообщений: 137
Записей в блоге: 1
11.01.2015, 16:12  [ТС] 11
SlavaSSU, Только один раз. Я пробовал перебор но time limit не дал.
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
11.01.2015, 16:14 12
Rasul96, перебор не зашел? какой там ТЛ?
0
27 / 27 / 6
Регистрация: 04.04.2013
Сообщений: 137
Записей в блоге: 1
11.01.2015, 16:16  [ТС] 13
SlavaSSU, 0.05c

Добавлено через 55 секунд
SlavaSSU, Мне сказали что динамика подойдет.
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
11.01.2015, 16:20 14
Rasul96,
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#undef NDEBUG
#ifdef _DEBUG
#define _GLIBCXX_DEBUG
#endif
 
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <list>
#include <vector>
#include <string>
#include <cstring>
#include <cmath>
#include <ctime>
#include <cassert>
 
using namespace std;
 
#define forn(i, n) for(int i = 0; i < (int)(n); i++)
#define forn1(i, n) for(int i = 1; i <= (int)(n); i++)
#define all(a) (a).begin(), (a).end()
#define sz(a) (int)((a).size())
#define mp make_pair
#define pb push_back
#define X first
#define Y second
#define y1 __y1
#define endl '\n'
#define sqr(x) (x) * (x)
 
typedef long long li;
typedef long double ld;
typedef pair<int, int> pt;
 
const int INF = (int)(1e9);
const li INF64 = (li)(INF) * (li)(INF);
const ld eps = 1e-15;
const ld pi = ld(3.1415926535897932384626433832795);
 
bool in(int i, int j, int n, int m)
{
    return i >= 1 && i <= n && j >= 1 && j <= m;
}
 
inline int myrand()
{
    return rand() ^ (rand() << 15);
}
 
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, 1, 0, -1};
 
const int dxh[] = {-2, -1, 1, 2, 2, 1, -1, -2};
const int dyh[] = {1, 2, 2, 1, -1, -2, -2, -1};
 
const int N = 111;
 
bool dp[N][N][N];
int n, m, k;
pt a[N];
 
int main(){
#ifdef _DEBUG
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
 
    cout << setprecision(15) << fixed;
    cerr << setprecision(10) << fixed;
 
    srand(int(time(NULL)));
 
    //kol-vo predmetov, nuzhniy wes, nuzhnaya stoimost
    cin >> n >> m >> k;
    forn1(i, n)
    {
        cin >> a[i].X >> a[i].Y;
        //a[i].X == wes
        //a[i].Y == stoimost
    }
 
    dp[0][0][0] = true;
 
    forn(i, n)
    {
        forn(sum, m + 1)
        {
            forn(cost, k + 1)
            {
                if(!dp[i][sum][cost])
                    continue;
                dp[i + 1][sum][cost] = true;
                int nsum = sum + a[i + 1].X;
                int ncost = cost + a[i + 1].Y;
                if(nsum <= m && cost <= k)
                {
                    dp[i + 1][nsum][ncost] = true;
                }
            }
        }
    }
 
    if(dp[n][m][k])
    {
        cout << "yes" << endl;
    }
    else
    {
        cout << "no" << endl;
    }
 
    cerr << "TIME == " << clock() << " ms" << endl;
    return 0;
}
1
27 / 27 / 6
Регистрация: 04.04.2013
Сообщений: 137
Записей в блоге: 1
11.01.2015, 16:31  [ТС] 15
SlavaSSU, а если там не два параметра (вес, ценность) а три например. Как тогда написать код?
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
11.01.2015, 16:37 16
Rasul96, у предметов есть еще характеристики?
0
27 / 27 / 6
Регистрация: 04.04.2013
Сообщений: 137
Записей в блоге: 1
11.01.2015, 16:40  [ТС] 17
SlavaSSU, Нет например здесь мы выбираем чтобы суммарный вес и цена предметов были равны M и K, а если есть и 3 параметр (и он должен равняться Z), то что тогда делать?
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
11.01.2015, 16:43 18
Rasul96, dp[N][N][N][N]; ну тогда получается что и у предметов есть еще 4 характеристика.
1
27 / 27 / 6
Регистрация: 04.04.2013
Сообщений: 137
Записей в блоге: 1
11.01.2015, 16:50  [ТС] 19
SlavaSSU, SlavaSSU, то есть там будет 4 for?
Ясно.
0
1 / 1 / 1
Регистрация: 11.01.2015
Сообщений: 26
11.01.2015, 17:10 20
Цитата Сообщение от Rasul96 Посмотреть сообщение
Так ведь мы же не знаем не знаем сколько слитков (слитков N'ое количество).
Цитата Сообщение от Киберпанк Посмотреть сообщение
C
1
2
3
4
printf("Enter quantity of ingots: ");
//Слитки, по порядку рассчитайсь!
scanf("%d",&nIng);
//Первый! Второй! ...Нас N'ое количество!
Краткость - сестра таланта.
Размер Вашего кода меня напугал.
0
11.01.2015, 17:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.01.2015, 17:10
Помогаю со студенческими работами здесь

Наследование, классы "сумки" и "обувь"
В магазине продаются сумки и обувь. Все товары имеют след характеристики: название, цена,...

Ошибка в заполнении БД
Когда добавляю новую строку в таблицу И пишу на месте Адрес Произвольный адрес (Пушкина 22) Он...

Ошибка при заполнении
Помогите определить где ошибка, так как какое число я не ввожу выводится в конце именно оно. Как...

Проверка при заполнении
Сделал проверку при заполнении полей. если поле пустое то выходит сообщение и label возле поля. На...


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

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