POJ1018 Communication System 动态规划

题目大意:

有一个系统,这个系统由n种设备组成,现在每种设备有m个,设备有两种属性:

一个是带宽(B),一个是价格(P)。

每种设备取一个,使min(B)/sum(P)的值最大。

(整个系统的B是所有设备的B的最小值。)

(整个系统的P是所有设备的P的和。)

输入:

先输入一个T,表示有T组数据。

每组数据第一行输入n。

接下来是n行,每行先输入m,然后输入m对数。

第i对数表示n种设备的第i个设备的B和P。

思路:

动态规划。

f[i][j]表示选完前i个设备,B=j的最小花费。

代码:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define Maxp 110
#define Maxn 11000
#define Maxf 0x7fffffff
#define Mes(x,y) memset(x,y,sizeof x)
#define Sort(a,x,y,o) sort(a+x,a+x+y,o)
using namespace std;
int f[Maxp][Maxn];
int main()
{
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
	int Times;
	scanf("%d",&Times);
	while(Times--)
	{
		int n;
		scanf("%d",&n);
		int Max=0;
		Mes(f,63);
		f[0][0]=0;
		for(int i=1;i<=n;i++)
		{
			int m;
			scanf("%d",&m);
			for(int j=1;j<=m;j++)
			{
				int x,y;
				scanf("%d%d",&x,&y);
				if(i==1&&f[i][x]>y)f[i][x]=y;
				for(int k=1;k<=Max;k++)
				{
					if(f[i-1][k]>99999)continue;
					int z=min(x,k);
					if(f[i][z]>f[i-1][k]+y)f[i][z]=f[i-1][k]+y;
				}
				if(x>Max)Max=x;
			}
			for(int k=1;k<=Max;k++)
				if(f[i][0]>f[i][k])f[i][0]=f[i][k];
		}
		double ans=0.0;
		for(int i=1;i<=Max;i++)
		{
			double s=1.0*i/f[n][i];
			if(s>ans)ans=s;
		}
		printf("%.3lf\n",ans);
	}
    return 0;
}

你可能感兴趣的:(POJ1018 Communication System 动态规划)