讨论 / 这破题,烦死我了!!!!~~~!@! 宝贵经验,大家注意
原始鸭 2008-08-11 17:09:00
点我顶贴 收藏 删除
用除法的时候一定要注意会不会除到0;

这道题也没写 pg[i],rune[i]的范围..我想总不能白给吧,不要最大值就无限了.可忽略了一点.那就是 pg了和rune有一个可以为0 只花费其中的一个...唉..失败..

结果只有样例一组数据没有0...其它9组数据全败了...

血的教训啊~~~!!!

#1 原始鸭@2008-08-10 08:31:00
回复 删除
以下是我写的程序.. 难道大家都想到了这种情况..还是大家的DP好一些...我觉得我写得够.烂了..

大家把自己的DP 过程贴上来,我学习一下

var

f:array[0..150,0..150] of real;

n,p,r,i,j,pp,rr,t,tt:integer;

pg,rune,suit,dps:array[1..150] of integer;

a,b:integer;

c,q:real;

begin

readln(n,p,r);

for i:=0 to p do

for j:=0 to r do

f[i,j]:=1;

for i:=1 to n do readln(pg[i],rune[i],suit[i],dps[i]);

for i:=1 to n do

for pp:=p downto 1 do

for rr:=r downto 1 do

begin

if pg[i]<>0 then t:=pp div pg[i] else t:=maxint;

if rune[i]<>0 then tt:=rr div rune[i] else tt:=maxint;

if tt<t then t:=tt;

if (suit[i]<>0) and (suit[i]<t) then t:=suit[i];

a:=0;b:=0;c:=1;

for j:=1 to t do

begin

inc(a,pg[i]);

inc(b,rune[i]);

c:=c*dps[i]/100;

q:=f[pp-a,rr-b]*c;

if q>f[pp,rr] then f[pp,rr]:=q;

end;

end;

writeln(f[p,r]*100:0:4);

end.

#2 phoenix@2008-08-10 17:33:00
回复 删除
我的没除p or r

var f:array[0..100,0..100]of real;

cp,cr:array[1..150]of longint;

num:array[1..150]of integer;

dps:array[1..150]of integer;

n,i,j,j1,j2,r,p,s:longint;

begin

readln(n,p,r);

for i:=0 to 100 do

for j:=0 to 100 do

f[i,j]:=1;

for i:=1 to n do

readln(cp[i],cr[i],num[i],dps[i]);

for i:=1 to n do

begin

if num[i]=0 then

begin

for j1:=cr[i] to r do

for j2:=cp[i] to p do

if f[j1,j2]<f[j1-cr[i],j2-cp[i]]*dps[i]/100 then

f[j1,j2]:=f[j1-cr[i],j2-cp[i]]*dps[i]/100;

end

else

for j:=1 to num[i] do

for j1:=r downto cr[i] do

for j2:=p downto cp[i] do

if f[j1,j2]<f[j1-cr[i],j2-cp[i]]*dps[i]/100 then

f[j1,j2]:=f[j1-cr[i],j2-cp[i]]*dps[i]/100;

end;

writeln(f[r,p]*100:0:4);

end.

#3 wish@2008-08-10 22:45:00
回复 删除
其实两个价格都为0也是可能的

想一想,为什么?

#4 Aaron_Kaka@2008-08-11 06:49:00
回复 删除
我又低级失误了……

#5 cth@2008-08-11 17:05:00
回复 删除
我的

#include<stdio.h>

int n,p,r,pg[151],rune[151],s[151];

double dps[151];

double mi(double j,int i)

{

int k;

double t=1.0;

for(k=1;k<=i;k++)

t*=j;

return t;

}

double dp()

{

double m[101][101],dps1;

int i,j,k,t,num,pg1,rune1;

for(i=0;i<=p;i++)

for(j=0;j<=r;j++)

m[i][j]=1.0;

for(i=k;k<=n;k++)

{

if(s[k]==0)

{

for(i=1;i<=p;i++)

for(j=1;j<=r;j++)

{

if(i<pg[k] || j<rune[k])

continue;

if(m[i-pg[k]][j-rune[k]]*dps[k]>m[i][j])

m[i][j]=m[i-pg[k]][j-rune[k]]*dps[k];

}

}

else

{

t=1,num=0;

while(num<s[k])

{

pg1=t*pg[k];

rune1=t*rune[k];

dps1=mi(dps[k],t);

for(i=p;i>=1;i--)

for(j=r;j>=1;j--)

{

if(i<pg1 || j<rune1)

break;

if(m[i-pg1][j-rune1]*dps1>m[i][j])

m[i][j]=m[i-pg1][j-rune1]*dps1;

}

num+=t;

if(s[k]-num<t*2)

t=s[k]-num;

else

t*=2;

}

}

}

return m[p][r];

}

int main()

{

int i,j;

double re;

scanf("%d %d %d\n",&n,&p,&r);

for(i=1;i<=n;i++)

{

scanf("%d %d %d %d\n",&pg[i],&rune[i],&s[i],&j);

dps[i]=((double)j)/100;

}

re=dp();

re*=100;

printf("%.4f\n",re);

}

#6 binarie@2008-08-11 17:09:00
回复 删除
program PgRune;

type

item=record

cp,cr,s:integer;dps:extended;

end;

var

N,P,R,i,j,l,ip,si,k:integer;

buf:item;b,mf:extended;

it:array[1..4800] of item;

f:array[0..100,0..100] of extended;

procedure sf(i1,i2:integer;v:double);

begin

if(i1>P)then exit;

if(i2>R)then exit;

if(f[i1,i2]<v)then

begin

f[i1,i2]:=v;

if(mf<v)then mf:=v;

end;

end;

function ft(base:double;time:integer):double;

var

cl:integer;

begin

ft:=base;

for cl:=2 to time do

ft:=ft*base;

end;

procedure ai(cp,cr:integer;dps:extended;s:integer);

begin

inc(ip);

it[ip].cr:=cr;

it[ip].cp:=cp;

it[ip].dps:=dps;

it[ip].s:=s;

end;

begin

mf:=1;

readln(N,P,R);

ip:=0;

for i:=1 to N do

begin

readln(buf.cp,buf.cr,buf.s,buf.dps);

if(buf.dps<100)then continue;

buf.dps:=buf.dps/100;

if(buf.s>0)then

begin

k:=1;

while k<buf.s do

begin

ai(buf.cp*k,buf.cr*k,ft(buf.dps,k),k);

buf.s:=buf.s-k;

k:=k*2;

end;

if(buf.s>0)then

ai(buf.cp*buf.s,buf.cr*buf.s,ft(buf.dps,buf.s),buf.s);

end

else

ai(buf.cp,buf.cr,buf.dps,0);

end;

for i:=0 to p do

for j:=0 to r do

f[i,j]:=0;

f[0,0]:=1;

for i:=1 to ip do

begin

if(it[i].s>0)then

for j:=p-it[i].cp downto 0 do

for k:=r-it[i].cr downto 0 do

begin

if(f[j,k]>0)then sf(j+it[i].cp,k+it[i].cr,f[j,k]*it[i].dps);

end

else

begin

for j:=0 to p-it[i].cp do

for k:=0 to r-it[i].cr do

if(f[j,k]>0)then sf(j+it[i].cp,k+it[i].cr,f[j,k]*it[i].dps);

end;

end;

writeln((mf*100):0:4);

end.

标程.....

查看更多回复
提交回复