动态规划之带宽与价格

来源:互联网 发布:淘宝信用卡额度多少 编辑:程序博客网 时间:2024/04/20 03:14
#include<iostream>#include<iomanip>#include<cstdio>using namespace std;#define inf 0x3f3f3f3fint dp[10000][10000];int min(int a,int b){if(a>=b)  return b;else  return a;}int main(){int t,n;cin>>t;while(t--){cin>>n;int i,j;for(i=1;i<=n;i++)  //初始化 ,都赋给最大值 {for(j=1;j<=10000;j++){dp[i][j]=inf;}}for(i=1;i<=n;i++){int m,band,price,k;cin>>m;while(m--){cin>>band>>price;if(i==1) /* 当遍历第一组是,将p赋给dp[1][band];  dp[1][band]为带宽为band的所用的价钱 */ {dp[1][band]=min(dp[1][band],price);   }else  /*当遍历第二组是*/ {for(k=1;k<=10000;k++){               if(dp[i-1][k]!=inf)    //找出前一组遍历过的dp[i-1][k];                {      if(k<=band)    //如果前一组的band值k 小于这组的band值 band       {      dp[i][k]=min(dp[i][k],dp[i-1][k]+price);  //就找出dp[i][k]和(前一组的dp[i-1][k]加上这组价格price)的最小值 ,并赋给 dp[i][k]      }      else    //这组的band值 band 小于如果前一组的band值k, 就找出dp[i][band]和(前一组的dp[i-1][k]加上这组价格price)的最小值 ,并赋给 dp[i][band]      {    dp[i][band]=min(dp[i][band],dp[i-1][k]+price);      }  }    }}}} double ans; double sum=0;for(i=1;i<=10000;i++){if(dp[n][i]!=inf){ans=(double)i/dp[n][i];if(ans>sum){   sum=ans;}}}printf("%.3f\n",sum);}} 

0 0
原创粉丝点击