题目点我
这道题有很多做法,贪心和搜索啥的都可以, 这里写动态规划的做法。
题目大意是说有一个通信系统,需要
n
个设备,每个设备从
如果定义状态
dp[k]
为选择完第
k
个设备后
从这个例子可以观察到当前状态定义表达能力不够,无法体现
B
的影响,那么把它加入到状态表示当中,用
由于
B
确定,
边界条件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxn 105
#define maxm 105
#define maxbw 10000
#define inf 0x3f3f3f3f
int dp[maxn][maxbw], m[maxn];
int bw[maxn][maxm], p[maxn][maxm];
int B[maxn * maxm], Bcnt;
int min(int a, int b){
return a > b ? b : a;
}
long double max(long double a, long double b){
return a > b ? a : b;
}
long double solve(int n){
int i, j, k;
for(i = 0; i < m[0]; i++){
dp[0][bw[0][i]] = min(p[0][i], dp[0][bw[0][i]]);
}
for(i = 1; i < n; i++){
for(j = 0; j < Bcnt; j++){
if(dp[i-1][B[j]] < inf){
for(k = 0; k < m[i]; k++){
if(bw[i][k] >= B[j])
dp[i][B[j]] = min(dp[i][B[j]], dp[i-1][B[j]] + p[i][k]);
else
dp[i][bw[i][k]] = min(dp[i][bw[i][k]], dp[i-1][B[j]] + p[i][k]);
}
}
}
}
long double ans = 0;
for(i = 0; i < Bcnt; i++){
if(dp[n-1][B[i]] < inf)
ans = max(ans, long double(B[i]) / long double(dp[n-1][B[i]]));
}
return ans;
}
int main(){
int t, n;
int i, j, k;
scanf("%d", &t);
while(t--){
memset(dp, 0x3f, sizeof(dp));
scanf("%d", &n);
Bcnt = 0;
for(i = 0; i < n; i++){
scanf("%d", &m[i]);
for(j = 0; j < m[i]; j++){
scanf("%d %d", &bw[i][j], &p[i][j]);
B[Bcnt++] = bw[i][j];
}
}
printf("%.3lf\n", solve(n));
}
return 0;
}