动态规划,看着被人的题解做的,还是有个疑问 ,就是带宽的最大值是怎么确定的,题目只说明是一个整数。
状态转移方程 :
dp[i][b] :其中i表示选取前i个公司的产品,b表示当前第i个公司从0 到最大值的带宽。dp[i][b]表示选取了前i个公司产品的价格。
如果
k :1 to max
if(k<=b) dp[i][k]=min(dp[i][k],dp[i-1][k]+p);
else dp[i][b]=min(dp[i][b],dp[i-1][k]+p);
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
int dp[102][1001];
int main()
{
int t;
cin>>t;
int b,p;
int i,j,k;
int n;
int c;
while(t--)
{
cin>>n;
for(i=0;i<=n;i++)
for(j=0;j<1005;j++)
{
dp[i][j]=inf;
}
for(i=1;i<=n;i++)
{
cin>>c;
for(j=0;j<c;j++)
{
cin>>b>>p;
if(i==1)
{
dp[1][b]=min(dp[1][b],p);
}
else
{
for(k=0;k<1001;k++)
{
if(dp[i-1][k]!=inf)
{
if(k<=b)
dp[i][k]=min(dp[i][k],dp[i-1][k]+p);
else
dp[i][b]=min(dp[i][b],dp[i-1][k]+p);
}
}
}
}
}
double ans=0;
for(i=0;i<1001;i++)
{
if(dp[n][i]!=inf)
{
ans=max(i*1.0/dp[n][i],ans);
}
}
printf("%.3f\n",ans);
}
return 0;
}