Консультация № 196713
18.10.2019, 17:36
0.00 руб.
0 1 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос, помогите решить или дайте совет: Имеется каталог на 15 видов с/х машин, где указаны: номер, цена и название. Десять фермерских хозяйств составили приоритетные списки, где указаны по 5 названий машин, которые хотели бы приобрести. Зная количество денег для этих целей в каждом хозяйстве, надо напечатать список номеров машин, которых может приобрести каждое хозяйство (предположить, что хозяйство будет покупать по одной машине каждого типа).
написать нужно на паскале

Обсуждение

давно
Старший Модератор
31795
6196
25.10.2019, 12:02
общий
это ответ
Здравствуйте, IvanDorohov!

Смотрите приложение:
[code lang=pascal h=300]const
k=5;
n=15;
m=10;
type
{}
tMas=array[1..k]of integer;
{описание сельхоз машин}
tVM=record{vilage mashin}
name:string;{название}
cost:integer;{стоимость}
indx:string;{индекс ???}
end;
{описание хозяйств}
tVA=record{vilage account}
name:string;{название}
summ:longint;{счет хозяйства}
want:tMas;{массив желаний}
end;
{генерация названий}
function gen(a:integer):string;
var
b:string;
begin
b:='';
while a>0 do
begin
b:=b+chr(ord('0')+random(10));
dec(a);
end;
gen:=b;
end;
{перебор вариантов}
function check(var a:tMas;b:integer):boolean;
var
c,d,e,f:integer;
begin
for c:=1 to k do a[c]:=0;
c:=0;
e:=1;
f:=1;
while(b>0)and(c<6)do
begin
d:=b and 1;
inc(c,d);
b:=b shr 1;
d:=d*e;
inc(e);
if(d in [1..n])and(f in [1..k])then
begin
a[f]:=d;
inc(f);
end;
end;
dec(f);
check:=(c=k)and(f=k);
end;
var
a:array[1..n]of tVM;
b:array[1..m]of tVA;
d:set of byte;
e:longint;
f,i,j:integer;
what:tMas;
begin
{ввод - генерация сельхоз машин}
for i:=1 to n do
begin{create vm}
write('name machine:');{readln(a[i].name)}a[i].name:='VM'+gen(6);write(a[i].name);
write('cost mashine:':15);{readln(a[i].cost)}a[i].cost:=6000+270*random(n);write(a[i].cost:6);
write('index mashine:':15);{readln(a[i].indx)}a[i].indx:='index:'+gen(8);writeln(a[i].indx);
end;{ /create vm}
writeln;
{ввод - генерация хозяйств}
for i:=1 to m do
begin{create VA}
write('name vilage:');{readln(b[i].name)}b[i].name:='vilage'+gen(4);writeln(b[i].name);
write('account vilage:');{readln(b[i].account)}b[i].summ:=39000+250*random(n);writeln(b[i].summ);
d:=[];
for j:=1 to k do
begin
repeat
e:=random(n)+1
until not (e in d);
d:=d+[e];
b[i].want[j]:=e;
end;
{вывод желаемого}
write('want:');
for j:=1 to k do
begin
write(a[b[i].want[j]].name:12);
e:=e+a[b[i].want[j]].cost;
end;
writeln;
if(e<=b[i].summ)and(e>0) then writeln(true){желаемое получилось}
else
begin{find variants}
writeln('find variants:');{начинаем поиск вариантов}
for j:=1 to 32000 do
begin
if check(what,j)then
begin
e:=0;
for f:=1 to k do e:=e+a[what[f]].cost;
if e<=b[i].summ then
begin
write('variant:');
for f:=1 to k do write(a[what[f]].name:9);{вывод варианта}
writeln('summa:=':8,e);
{ break;{если убрать коммент, будет выводить только один вариант}
end;
end;
end;
end;{/find variants}
writeln;
end;{/create VA}
end.[/code]

Выводится следующая информация :
Цитата: список сельхоз машин
name machine:VM008226 cost mashine: 7080 index mashine:index:13404080
name machine:VM293736 cost mashine: 9240 index mashine:index:73134282
name machine:VM418279 cost mashine: 7890 index mashine:index:88011505
name machine:VM076775 cost mashine: 6810 index mashine:index:65969262
name machine:VM074855 cost mashine: 9780 index mashine:index:63079771
name machine:VM197586 cost mashine: 7080 index mashine:index:06281259
name machine:VM112154 cost mashine: 7080 index mashine:index:16770001
name machine:VM783647 cost mashine: 7890 index mashine:index:38810001
name machine:VM625238 cost mashine: 7080 index mashine:index:36693427
name machine:VM757455 cost mashine: 9510 index mashine:index:61441056
name machine:VM098692 cost mashine: 8700 index mashine:index:74612931
name machine:VM930185 cost mashine: 8700 index mashine:index:16039534
name machine:VM933408 cost mashine: 8970 index mashine:index:19418428
name machine:VM516953 cost mashine: 7620 index mashine:index:21696650
name machine:VM712874 cost mashine: 9780 index mashine:index:10103330


Цитата: желание совпало с возможностями
name vilage:vilage4546
account vilage:42000
want: VM625238 VM076775 VM197586 VM516953 VM757455
TRUE


Цитата: перебор возможных вариантов
name vilage:vilage6879
account vilage:39500
want: VM930185 VM074855 VM098692 VM112154 VM712874
find variants:
variat: VM008226 VM293736 VM418279 VM076775 VM197586 summa:=38100
variat: VM008226 VM418279 VM076775 VM074855 VM197586 summa:=38640
variat: VM008226 VM293736 VM418279 VM076775 VM112154 summa:=38100
variat: VM008226 VM418279 VM076775 VM074855 VM112154 summa:=38640
variat: VM008226 VM293736 VM418279 VM197586 VM112154 summa:=38370


Если захотите руками вводить информацию, в строках, аналогичных этой:
[code lang=pascal]write('name machine:');{readln(a[i].name)}a[i].name:='VM'+gen(6);write(a[i].name);[/code]
Уберите комментарий с readln, а все, что за ним закомментируйте.
Удачи!
5
Большое спасибо, Константин Николаевич
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа