Junior
Статус: Не в сети Регистрация: 13.09.2006 Откуда: Москва
Здравствуйте. Вот заданьице: http://rolex0.narod.ru/excel.htm Ну насчет режимов это я понял. А вот как заполнить плату не могу сообразить . Пытался все через "ЕСЛИ()" сделать, так оно больше 7 вложений не поддерживает (мне-то 12 нужно). Кто знает как сделать подскажите пожалуйста.
Вот в экселевском формате http://rolex0.narod.ru/itog.xls
Member
Статус: Не в сети Регистрация: 23.07.2005 Откуда: Екатеринбург
Маюсь уже месяц. Надо написать на С++:
Имеется набор предметов, для каждого из которых указаны его название, вес и стоимость. Требуется составить набор с наибольшей суммарной стоимостью и весом, не превышающим заданного ограничения.
(консольное приложение)
Member
Статус: Не в сети Регистрация: 08.07.2003 Откуда: Новосибирск
LikvidatorMax
Цитата:
Маюсь уже месяц. Надо написать на С++:
Не верю. Вычисляешь коэффициенты для каждого предмета: P/W (P - цена, W - вес), сортируешь массив/список по коэффициентам, суммируешь позиции с максимальными до истечения лимита веса.
Junior
Статус: Не в сети Регистрация: 05.10.2007 Откуда: Москва
VISUAL BASIC 6.0! ПоМоГиТе плийз!....
Вот есть:
s2=3,5
есть массив
DIM y(14)
x=4
for i=1 to 14 step 1
y(i)=x
x=x+2
next i
как сделать так, чтобы мне из этого массива прога выбирала Ближайшее число, которе было бы больше, чем S2, то есть больше чем 3.5.
Массив создала с целью, чтобы были числа 4,6,8,10....30, как вы поняли уже.
Поможете?
_________________ Я обновила свой комп! УРА! ))
В профиле подробности!
Dim s3 as integer
s3 = s2
for i=1 to 14 step 1
if ((s3 = s2) and (y(i) > s2)) or ((s3 > s2) and (y(i) > s2) and (y(i) < s3)) then
s3 = y(i)
end if
next i
Если s3 = s2, то значит чисел больше, чем s2 в массиве и не было. Это так, быстрое решение, самое первое что пришло на ум.
Member
Статус: Не в сети Регистрация: 23.07.2005 Откуда: Екатеринбург
SEKTOR Я так и сделал. Это был первый вариант. Но мне сказали что это не правильно, и премнимо только для тех объектов, которые можно разделить.
И привели примеры. Действительно не работает в данной задаче это. Нужно что-то другое.[/b]
Member
Статус: Не в сети Регистрация: 08.07.2003 Откуда: Новосибирск
Либо ты, либо они чего-то не поняли. Никто никакие товары не делит. Вычисляются коэффициенты, зависящие напрямую от веса и цены. Приведи примеры, которые не работают.
Member
Статус: Не в сети Регистрация: 23.07.2005 Откуда: Екатеринбург
Ну вот напрмер:
Стул вес-2 стоимость-200 отношение 100
Стол вес-3 стоимость-250 отношение примерно 83
Ограничение - 3.
Ведь твой алгоритм выберет "стул", так как у него коэффициент лучше. А надо "стол"
Вот такой вот пример
Member
Статус: Не в сети Регистрация: 08.07.2003 Откуда: Новосибирск
LikvidatorMax Хорошо, если имеет место частный случай (это, если не ошибаюсь, единственное исключение) и набор может состоять максимум из одного предмета - из числа предметов с максимально допустимым весом ищешь предмет с максимальной ценой.
LikvidatorMax Если честно, то не понял твоего задания. Что значит с наибольшей суммарной стоимостью? Понимаю, если бы было несколько наборов и комбинаций, но ты выбираешь из одного набора. Может быть просто с максимальной стоимостью? Поясни.
Member
Статус: Не в сети Регистрация: 23.07.2005 Откуда: Екатеринбург
sashar2 Хм. Вроде все ясно. Пользователь вводит имя вещи, ее вес, стоимость. Вещей несколько. Надо собрать из них такой набор, чтоб уложиться в вес определенный и при таком весе набрать максимальную общую стоимость вещей.
SEKTOR Я сделал. Но... все равно не приняли.
Дали подсказку- сделать перебором всех комбинаций. Но как?
LikvidatorMax Теперь всё ясно, если останется время - напишу. Добавлено спустя 1 час, 13 минут, 9 секунд
LikvidatorMax писал(а):
sashar2 Хм. Вроде все ясно. Пользователь вводит имя вещи, ее вес, стоимость. Вещей несколько. Надо собрать из них такой набор, чтоб уложиться в вес определенный и при таком весе набрать максимальную общую стоимость вещей.
SEKTOR Я сделал. Но... все равно не приняли. Дали подсказку- сделать перебором всех комбинаций. Но как?
Вот буквально за минут 15 написал, об оптимизациях речи не идет, но зато работает. Если есть замечания, то напиши - возможно я с утра посмотрю и поправлю что-то.
const int ITEMS_COUNT = 3; const double MAX_WEIGHT = 100;
struct { string Name; double Weight; double Cost;
} typedef Item;
//функция проверяет есть ли в списке повторяющиеся элементы, такого в данной задаче быть не может bool listValid(int *temp) { for (int i = 0, count = 0; i < ITEMS_COUNT; i++) { count = 0; for (int j = 0; j < ITEMS_COUNT; j++) { if (temp[j] == temp[i]) count++; } if (count > 1) return false; } return true; }
//находит сумму у предметов в данной расстановке на максимальную сумму void getSum(Item *items, int *temp, double &tempSum) { double sum = 0; double w = 0; for (int i = 0; i < ITEMS_COUNT && w < MAX_WEIGHT; i++) { w += items[temp[i]].Weight; if (w < MAX_WEIGHT) sum += items[temp[i]].Cost; else break; } tempSum = sum; }
//получаем следующую комбинацию void NextList(int *temp) { temp[0]++; for (int i = 0; i < ITEMS_COUNT; i++) { if (temp[i] >= ITEMS_COUNT) { temp[i] = 0; temp[i+1]++; } } }
//проверяем перебрали ли все варианты bool ok(int *temp) { for (int i = 0; i < ITEMS_COUNT; i++) if (temp[i] != ITEMS_COUNT - 1) return true; return false; }
int main() { //инициализация srand(GetTickCount()); Item *items = new Item[ITEMS_COUNT]; int *temp = new int[ITEMS_COUNT]; int *result = new int[ITEMS_COUNT]; double tempSum = 0; double resultSum = 0; for (int i = 0; i < ITEMS_COUNT; i++) { items[i].Name = "Item name"; items[i].Weight = rand()%100; items[i].Cost = rand()%1000; temp[i] = -1; result[i] = -1; } // //Само решение while (ok(temp)) { if (listValid(temp)) getSum(items, temp, tempSum); if (tempSum > resultSum) { double w = 0; for (int i = 0; i < ITEMS_COUNT; i++) { w += items[temp[i]].Weight; if (w < MAX_WEIGHT) result[i] = temp[i]; else result[i] = -1; } resultSum = tempSum; } NextList(temp); } //Вывод данных for (int i = 0; i < ITEMS_COUNT; i++) cout << items[i].Cost << "=" << items[i].Weight << " "; cout << endl;
for (int i = 0; i < ITEMS_COUNT; i++) cout << result[i] << " "; cout << endl; cout << resultSum << endl; cin >> resultSum; // //Очистка памяти delete[] items; delete[] temp; delete[] result; return 0; }
Junior
Статус: Не в сети Регистрация: 05.10.2007 Откуда: Москва
sashar2
sashar2 писал(а):
Dim s3 as integers3 = s2for i=1 to 14 step 1if ((s3 = s2) and (y(i) > s2)) or ((s3 > s2) and (y(i) > s2) and (y(i) < s3)) thens3 = y(i)end ifnext i
Если s3 = s2, то значит чисел больше, чем s2 в массиве и не было. Это так, быстрое решение, самое первое что пришло на ум.
Что-то я не поняла... прямо так все написать, как ты написал, и заработает?
А как же тот факт, что ряд чисел: 4, 6, 8, 10.... 30.
Где ты его указываешь, в какой строчке?
То есть если использовать твой код, у меня s2=3.5 допустим. Тогда он будет выбирать S3=4 ?
Просто мне надо быть 100% уверенной, что код работает, чтобы не обламаться.
Можешь проверить на своем компе, а то у меня Visual Basic 6.0 нету на компе, да и в нете его негде скачать!
Пасиба заранее за помощь!
_________________ Я обновила свой комп! УРА! ))
В профиле подробности!
Анжелика Я написал ту часть, которая отвечает этим словам:
Анжелика писал(а):
как сделать так, чтобы мне из этого массива прога выбирала Ближайшее число, которе было бы больше, чем S2, то есть больше чем 3.5. Массив создала с целью, чтобы были числа 4,6,8,10....30, как вы поняли уже.
Т.е мой код нужно написать после уже имеющегося.
Проверить к сожалению не могу т.к у меня нету vb 6.0. Стоит только 2005 и 2008 студии. Еще и шестую ставить неохота.
Member
Статус: Не в сети Регистрация: 30.01.2007 Откуда: Москва
SEKTOR
впринципе всё - "от А до Я"
У нас лабы по VB были типа заходит в аудиторию 25человек за 8 компов...и тупо перепечатывает код программ в кнопки интерфейса...а теперь курсач задали и крутись как хочешь...:writer:
Хотелось бы, чтоб расписали код программ, желательно со скринами интерфейса...Если бы выложили сами программы, то вообще бы шикарно было...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения