當前位置:編程學習大全網 - 編程語言 - 求貪心算法題(Pascal)

求貪心算法題(Pascal)

背包問題

program beibao;

const

m=150;

n=7;

var

xu:integer;

i,j:integer;

goods:array[1..n,0..2] of integer;

ok:array[1..n,1..2] of real;

procedure init;

var

i:integer;

begin

xu:=m;

for i:=1 to n do

begin

write('Enter the price and weight of the ',i,'th goods:');

goods[i,0]:=i;

read(goods[i,1],goods[i,2]);

readln;

ok[i,1]:=0; ok[i,2]:=0;

end;

end;

procedure make;

var

bi:array[1..n] of real;

i,j:integer;

temp1,temp2,temp0:integer;

begin

for i:=1 to n do

bi[i]:=goods[i,1]/goods[i,2];

for i:=1 to n-1 do

for j:=i+1 to n do

begin

if bi[i]<bi[j] then begin

temp0:=goods[i,0]; temp1:=goods[i,1]; temp2:=goods[i,2];

goods[i,0]:=goods[j,0]; goods[i,1]:=goods[j,1]; goods[i,2]:=goods[j,2];

goods[j,0]:=temp0; goods[j,1]:=temp1; goods[j,2]:=temp2;

end;

end;

end;

begin

init;

make;

for i:=1 to 7 do

begin

if goods[i,2]>xu then break;

ok[i,1]:=goods[i,0]; ok[i,2]:=1;

xu:=xu-goods[i,2];

end;

j:=i;

if i<=n then

begin

ok[i,1]:=goods[i,0];

ok[i,2]:=xu/goods[i,2];

end;

for i:=1 to j do

writeln(ok[i,1]:1:0,':',ok[i,2]*goods[i,2]:2:1);

end.

旅行家問題

program jiayou;

const maxn=10001;

zero=1e-16;

type

jd=record

value,way,over:real;

end;

var oil:array[1..maxn] of ^jd;

n:integer;

d1,c,d2,cost,maxway:real;

function init:boolean;

var i:integer;

begin

new(oil[1]);

oil[1]^.way:=0;

read(d1,c,d2,oil[1]^.value,n);

maxway:=d2*c;

for i:=2 to n+1 do

begin

new(oil[i]);

readln(oil[i]^.way,oil[i]^.value);

oil[i]^.over:=0;

end;

inc(n,2);

new(oil[n]);

oil[n]^.way:=d1;

oil[n]^.value:=0;

oil[n]^.over:=0;

for i:=2 to n do

if oil[i]^.way-oil[i-1]^.way>maxway then

begin

init:=false;

exit

end;

init:=true;

end;

procedure buy(i:integer;miles:real);

begin

cost:=cost+miles/d2*oil[i]^.value;

end;

procedure solve;

var i,j:integer;

s:real;

begin

i:=1;j:=i+1;

repeat

s:=0.0;

while( s<=maxway+zero) and (j<=n-1) and (oil[i]^.value<=oil[j]^.value) do

begin

inc(j);

s:=s+oil[j]^.way-oil[j-1]^.way

end;

if s<=maxway+zero then

if (oil[i]^.over+zero>=oil[j]^.way-oil[i]^.way) then

oil[j]^.over:=oil[i]^.over-(oil[j]^.way-oil[i]^.way) else

begin

buy(i,oil[j]^.way-oil[i]^.way-oil[i]^.over);

oil[j]^.over:=0.0;

end

else begin

buy(i,maxway-oil[i]^.over);

j:=i+1;

oil[j]^.over:=maxway-(oil[j]^.way-oil[i]^.way);

end;

i:=j;

until i=n;

end;

begin

cost:=0;

if init then begin

solve;

writeln(cost:0:2);

end else writeln('No answer');

end.

n個部件,每個部件必須經過先A後B兩道工序

program workorder;

const maxn=100;

type jd=record

a,b,m,o:integer;

end;

var n,min,i:integer;

c:array[1..maxn] of jd;

order:array[1..maxn] of integer;

procedure init;

var i:integer;

begin

readln(n);

for i:=1 to n do

read(c[i].a);

readln;

for i:=1 to n do

read(c[i].b);

readln;

for i:=1 to n do

begin

if c[i].a<c[i].b then c[i].m:=c[i].a else c[i].m:=c[i].b;

c[i].o:=i;

end;

end;

procedure sort;

var i,j,k,t:integer;

temp:jd;

begin

for i:=1 to n-1 do

begin

k:=i;t:=c[i].m;

for j:=i+1 to n do

if c[j].m<t then begin t:=c[j].m;k:=j end ;

if k<>i then begin temp:=c[i];c[i]:=c[k];c[k]:=temp end

end;

end;

procedure playorder;

var i,s,t:integer;

begin

fillchar(order,sizeof(order),0);

s:=1;

t:=n;

for i:=1 to n do

if c[i].m=c[i].a then begin order[s]:=i;s:=s+1 end

else begin order[t]:=i;t:=t-1;end;

end;

procedure calc_t;

var i,t1,t2:integer;

begin

t1:=0;t2:=0;

for i:=1 to n do

begin

t1:=t1+c[order[i]].a;

if t2<t1 then t2:=t1;

t2:=t2+c[order[i]].b;

end;

min:=t2;

end;

begin

init;

sort;

playorder;

calc_t;

writeln(min);

for i:=1 to n do

write(c[order[i]].o,' ');

writeln;

end.

沒時間寫了湊合著看看,履行承諾啊追加分數

  • 上一篇:UI設計是什麽,主要是幹什麽的?
  • 下一篇:產品思考:什麽叫優先級?怎麽劃分優先級?
  • copyright 2024編程學習大全網