Помощь - Поиск - Пользователи - Календарь
Полная версия: Копилка
Форум «Всё о Паскале» > 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.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.