| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
我的dp思路设数组answer【110】【10010】,a【i】【j】表示前i个物品最小带宽为j时的最小总和(前提是假设带宽不超过10000),详见代码。
#include <stdio.h>
typedef struct
{
int band,price;
}Node;
Node array[110][110];
int answer[110][10010];
int num,number[110];
double result;
void initial();
void dp();
void deal();
void initial()
{
int i,j;
scanf("%d",&num);
for(i=1;i<=num;i++)
{
scanf("%d",&number[i]);
for(j=1;j<=number[i];j++)
scanf("%d%d",&array[i][j].band,&array[i][j].price);
}
for(i=1;i<=num;i++)
for(j=1;j<=10000;j++)
answer[i][j]=99999;
for(i=1;i<=number[1];i++)
if(array[1][i].price<answer[1][array[1][i].band])
answer[1][array[1][i].band]=array[1][i].price;
}
void dp()
{
int i,j,k,temp,min;
for(i=1;i<=num-1;i++)
for(j=1;j<=10000;j++)
{
if(answer[i][j]!=99999)
{
for(k=1;k<=number[i+1];k++)
{
min=j;
if(array[i+1][k].band<min)
min=array[i+1][k].band;
temp=answer[i][j]+array[i+1][k].price;
if(temp<answer[i+1][min])
answer[i+1][min]=temp;
}
}
}
}
void deal()
{
int i;
double temp;
result=0;
for(i=1;i<=10000;i++)
if(answer[num][i]!=99999)
{
temp=(double)i/(double)answer[num][i];
if(temp>result) result=temp;
}
printf("%.3f\n",result);
}
int main()
{
int cases;
scanf("%d",&cases);
while(cases--)
{
initial();
dp();
deal();
}
return 0;
}
据说此题数据很水,虽然过了,但还是可能出现错误,希望到时有高人指正。飘过。。。。。。。。。
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator