Помощь - Поиск - Пользователи - Календарь
Полная версия: Копилка
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Оленька
Слёзно прошу, помогите мне пожалуйста решить задачу в Паскале. Сама я не могу в ней разобраться, а уже скоро надо её отдать преподавателю!

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

Копилка
Заданы вес Е пустой копилки и вес 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
klem4
Цитата
Ввод 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.

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

везде где "<" должно быть "≤"
Оленька
please
помогите доделать программу klem4'a

пожалуйста ! wub.gif wub.gif wub.gif wub.gif wub.gif
virt
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.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.