IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Копилка
Оленька
сообщение 21.11.2005 15:22
Сообщение #1


Гость






Слёзно прошу, помогите мне пожалуйста решить задачу в Паскале. Сама я не могу в ней разобраться, а уже скоро надо её отдать преподавателю!

Пожалуйста, решите ! текст программы выложите сюда!
Заранее благодарна!

Копилка
Заданы вес Е пустой копилки и вес F копилки с монетами. В копилке могут находиться монеты N видов; известны ценность Pi каждого вида монет и вес Wi одной монеты. Найти минимальную и максимальную суммы денег, которые могут находиться в копилке.
Ограничения:
1 < E < F < 10000, 1 < N < 500, 1 < Рi < 50000, 1 < Wi < 10000,
все числа целые, время 2 с.

Ввод из файла piggy.in. В первой строке находятся числа Е и F, во второй - число N, в следующих N строках - по два числа, Рi и Wi.

Вывод в файл piggy.out. Выводятся два числа через пробел - минимальная и максимальная суммы. Если копилка не может иметь точно заданный вес при условии, что она наполнена монетам заданных видов, - вывести This is impossible...

Примеры
Цитата
Ввод 1
1000 1100
2
1 1
5 2
Вывод 1
100 250


Ввод 2
1000 1010
2
6 3
2 2
Вывод 2
10 16


Ввод 3
1000 2000
1
10 3
Вывод 3
This is impossible


Сообщение отредактировано: volvo - 21.11.2005 15:58
 К началу страницы 
+ Ответить 
klem4
сообщение 21.11.2005 18:28
Сообщение #2


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Цитата
Ввод 2
1000 1010
2
6 3
2 2
Вывод 2
10 16


тут ошибка ибо 1010-1000 = 10

один вид монет : стоимость 6, вес - 3 -> 10 div 3 = 3, 3*6 = 18
получается максимум 18 а не 16

вот что получилось такая вещь, я не уверен что это точно правильно, но идее решения мне кажется верна, пока версия без файла, да и еще не знаю как сделать проверку на This is impossible... Так что вводить данные надо по аккуратней ) попозже постараюсь доделать/переделать, а пока вот :

uses crt;
type

TRubl = record
p,w : word;
end;

TMoney = array[1..20] of TRubl;
var
empty, full, n , m, _min, _max: integer;
money : TMoney;

procedure Input(var x : TMoney; size : byte);
var
i : byte;
begin
for i := 1 to size do begin
write('p[',i,']=');
readln(x[i].p);
write('w[',i,']=');
readln(x[i].w);
end;
end;

procedure Sort(var x : TMoney; size : byte);
var
i : byte;
flag : boolean;
temp : TRubl;
begin
repeat
flag := true;
for i := 1 to size - 1 do
if not(x[i].p<=x[i+1].p) then begin
flag := false;
temp := x[i];
x[i] := x[i+1];
x[i+1] := temp;
end;
until flag;
end;

procedure GetMinMax(x : TMoney; size,mass : integer; var max, min : integer);
var
i,j,tempM : byte;
sum : word;
begin

max := 0;
min := maxint;

tempM := mass;

j := size + 1;

repeat

dec(j);

sum := 0;

mass := tempM;

for i := j downto 1 do begin
inc(sum, x[i].p * (mass div x[i].w));
dec(mass, (mass div x[i].w) * x[i].w);
end;

if sum>max then max := sum;
if sum<min then min := sum;

until j=1;


end;

begin

clrscr;

write('Вес пустой копилки : '); readln(empty);
write('Вес копилки с монетакм : '); readln(full);
write('Введите кол-во монет : '); readln(n);

m := full - empty;

Input(money, n);

Sort(money ,n);

GetMinMax(money, n, m, _max, _min);

writeln(_max);
writeln(_min);

readln
end.



--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Оленька
сообщение 21.11.2005 19:24
Сообщение #3


Гость






To: klem4
я знак ошибочно не тот поставила! извиняюсь!

везде где "<" должно быть "≤"
 К началу страницы 
+ Ответить 
Оленька
сообщение 23.11.2005 21:59
Сообщение #4


Гость






please
помогите доделать программу klem4'a

пожалуйста ! wub.gif wub.gif wub.gif wub.gif wub.gif
 К началу страницы 
+ Ответить 
virt
сообщение 23.11.2005 23:17
Сообщение #5


Знаток
****

Группа: Пользователи
Сообщений: 419
Пол: Мужской

Репутация: -  6  +


klem ,если сортировать ,то сортировать по отношению цена/вес ,а не просто по цене.

program kopilka;
var v,vk,n,i,j : longint;
b : array[1..100,1..2]of longint;
a : array[0..10000]of longint;

procedure init;
begin
read(vk,v,n);
for i := 1 to n do
read(b[i,1],b[i,2]);
end;

function min(a,b : longint):longint;
begin
if a < b then min := a else min := b;
end;

procedure solve;
begin
v := v - vk;
a[0] := 0;
for i := 1 to v do a[i] := maxlongint - 50001;
for i := 1 to n do
for j := 0 to v do
if j + b[i,2] <= v then
a[j + b[i,2]] := min(a[j + b[i,2]],a[j] + b[i,1]);
end;

procedure out;
begin
if a[v] = maxlongint - 50001 then write('no')
else writeln(a[v]);
end;

begin
init;
solve;
out;
end.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 7:23
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"