题目链接:http://poj.org/problem?id=1018
这个DP,我的头都快晕了。
dp[i][j]表示取到第i个设备,宽带为j时的最小价格。
状态转移方程:
dp[i][k]=min(dp[i][k],dp[i-1][k]+p)
输出结果:
for(int i=0;i<=1100;i++){
ans=max(ans,(double)i/dp[n][i]);
}
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int inf = 0x3f3f3f3f; int dp[120][1200]; ///dp[i][j]表示搜索到第i个设备,宽带为j时,的最少费用 int main() { int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); for(int i=1; i<=n; i++) ///初始化 { for(int j=0; j<1100; j++) dp[i][j]=inf; } ///DP for(int i=1; i<=n; i++) { int num; scanf("%d",&num); for(int j=1; j<=num; j++) { int p,b; scanf("%d%d",&b,&p); if(i==1) { dp[1][b]=min(dp[1][b],p); } else { for(int k=0; k<1100; 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(int i=0; i<1100; i++) { if(dp[n][i]!=inf) { double k=(double)i/dp[n][i]; if(k>ans) ans=k; } } printf("%.3lf\n",ans); } return 0; }
时间: 2025-01-04 14:43:02