题目意思:
目前有一个公司需要购进宽带设备,每种设备有多款机器供选择,每种设备都需购进一台,现给出每台设备的带宽p与价格q,要求选择设备的最小带宽min§/add(q)(其中min§表示所有购进设备中最小的带宽,add(q)表示所有购进设备的价格之和)为最大,并求出该值。
这道题是我在做hdu1003时看到dp做法,后面百科上推荐的运用到低级dp的题目。但是自己看了很长时间连题目意思都很难理解,后面没办法只好百度。看懂题意后因为知道是要用dp做,但是找不到状态转换方程,只能怪自己太废。又是一波百度,发现可以用贪心去写,然后在网上看了份代码,后面自己码了一遍。虽然ac了,但是觉得那种贪心是从带宽最小值枚举到最大值,自认是是会tle,没想到还能过。自己后面改了一下代码:也是固定一个带宽然后去贪心,不过我的代码固定的带宽是样例中出现的,虽然这样看起来是比较省时间的,后面在实现的过程中发现可能会达到10e8次操作,好在不会超时,中间也wa了一次,是细节上的问题,调试了一会就ac了。先附上我的贪心代码:
#include <stdio.h>
int main()
{
int T;
int n,i,j,min,min2,sum,i1,j1;
double ans=0;
int a[101][101],b[101][101],c[101];//a是带宽,b是价格,c是有几个设备供选择
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
ans=0;
for(i=0;i<n;i++)
{
scanf("%d",&c[i]);
for(j=0;j<c[i];j++)
{
scanf("%d%d",&a[i][j],&b[i][j]);
}
}
for(i=0;i<n;i++)
{
for(j=0;j<c[i];j++)
{
sum=0;
min=a[i][j];
for(i1=0;i1<n;i1++)
{
min2=10000;
for(j1=0;j1<c[i1];j1++)
if((a[i1][j1]>=min)&&(b[i1][j1]<min2))
min2=b[i1][j1];
sum+=min2;
}
if(ans<min*1.0/sum)
ans=min*1.0/sum;
}
}
printf("%.3f\n",ans);
}
return 0;
}
后面会有我的动态规划解法,未完待续······