动态规划题目:
有一个系统有n个设备,每个设备有m个制造商,每个制造商制造的设备的最大带宽和价值是不同的,题目要求计算n个设备组成的系统中max(B/P)。其中B为带宽最小值,P为最大值。
解题思路:
选出所有带宽的最大值和最小值,定下带宽,随后从小到大枚举。
剪枝——对每个厂商的设备按带宽从大到小枚举,若最大带宽都小于我们占定的带宽,则不需要在对这种情况枚举,直接剪枝。
代码:
#include <iostream>
#include <cstdlib>
#include <string>
#include <algorithm>
using namespace std;
const int inf = 0x7fffffff;
struct node {
int B;
int P;
};
bool cmp(node m, node n) {
return m.B> n.B;
}
int main() {
int t, n, current_B,current_P;
int maxb = -inf;
int minb = inf;
int minp;
double ans;
int x[500];
scanf("%d",&t);
node a[500][500];
while(t--) {
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d",&x[i]);
for(int j= 0; j < x[i]; j++) {
scanf("%d %d",&a[i][j].B,&a[i][j].P);
maxb = max(maxb,a[i][j].B);
minb = min(minb,a[i][j].B);
}
sort(a[i],a[i]+x[i], cmp);
}
ans = 0.0;
for(int i = minb; i <= maxb; i++){
current_P = 0;
for(int j = 0; j< n; j++) {
minp =10000;
for(int k= 0; k < x[j]; k++) {
if(a[j][k].B >= i&& a[j][k].P < minp){
minp = a[j][k].P;
} else if(a[j][k].B < i) {
break;
}
}
current_P+= minp;
}
double tem = 1.0*i/current_P;
if(tem > ans)
ans = tem;
}
printf("%0.3f\n", ans);
}
//system("pause");
return 0;
}