简单dp题,0-1背包模型。定义d[i][j]表示考虑完前i个设备,最大bandwidth为j时的最小费用。bandwidth的范围题目中没说,但貌似不大(500以内)
#define UVa "poj-1018.cpp" //Communication System
char fileIn[30] = UVa, fileOut[30] = UVa;
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
//Global Variables. Reset upon Each Case!
const int maxn = 100 + 5, maxm = 500;
int kase, n;
int B[maxn][maxn], P[maxn][maxn], mi[maxn], d[maxm][2];
/
void update(int& targ, int src) {
if(targ == -1 || targ > src) targ = src;
}
int main() {
scanf("%d", &kase);
while(kase --) {
scanf("%d", &n);
for(int i = 0; i < n; i ++) {
scanf("%d", &mi[i]);
for(int j = 0; j < mi[i]; j ++) scanf("%d%d", &B[i][j], &P[i][j]);
}
int t = 0;
for(int i = 0; i < maxm; i ++) d[i][t] = -1;
for(int u = 0; u < n; u ++) {
for(int i = 0; i < maxm; i ++) d[i][t^1] = -1;
for(int i = 0; i < mi[u]; i ++) {
if(u == 0) update(d[B[u][i]][t^1], P[u][i]);
else for(int b = 0; b < maxm; b ++) {
if(d[b][t] != -1)
update(d[min(b, B[u][i])][t^1], d[b][t] + P[u][i]);
}
}
t ^= 1;
}
float ans = 0;
for(int i = 0; i < maxm; i ++) if(d[i][t] != -1) ans = max(ans, (float)i/(float)d[i][t]);
printf("%.3f\n", ans);
}
return 0;
}