题意:
一个通信系统需要n个设备,每个设备有两个属性带宽B和价格P,第i个设备有mi个厂家生产,从中挑选n个设备,问n个设备中最小的带宽/总价格(B/P)的最大值是多少;
思路:
dp[i][j]表示前i个设备中带宽为j的最小费用(相同带宽费用越小,B/P越大)
dp[i][j]=min(dp[i][j],dp[i-1][j]+p);
#include<iostream> #include<cstdio> #include<cstring> #include<math.h> #include<algorithm> using namespace std; const int INF=0x3f3f3f3f; const int maxn=1005; int t,n,m; int dp[105][maxn];//dp[i][j]表示前i个设备带宽为j的最小费用 int main() { #ifndef ONLINE_JUDGE freopen("test.in","r",stdin); freopen("test.out","w",stdout); #endif scanf("%d",&t); while(t--){ scanf("%d",&n); memset(dp,INF,sizeof(dp)); for(int i=1;i<=n;i++){ int m,b,p; scanf("%d",&m); for(int j=0;j<m;j++){ scanf("%d%d",&b,&p); if(i==1){ dp[i][b]=p; } else{ for(int k=0;k<maxn;k++){ if(dp[i-1][k]!=INF){//须保证带宽为k的设备存在 if(k>b){ dp[i][b]=min(dp[i][b],dp[i-1][k]+p); } else{ dp[i][k]=min(dp[i][k],dp[i-1][k]+p); } } } } } } double res=0; for(int i=0;i<maxn;i++){ if(dp[n][i]==INF) continue; double tmp=i*1.0/dp[n][i]; if(tmp>res) res=tmp; } printf("%.3f\n",res); } return 0; }