zoukankan      html  css  js  c++  java
  • zoj1409 Communication System

    【题意】:题意:有n种设备,每种有mi件,每件设备有一个带宽和价格,从每种设备中选一件,使得带宽B/总价格P的值最大。B为挑选的n件设备中带宽最小的设备的带宽,P为n件设备的总价格。

    【分析】:

    int dp[105][10005];//i件设备,最小带宽(瓶颈)为j时的最小花费

    那么,这个问题就类似一个背包,对于每种最小带宽,找到最小的总价格即可。

           for(int i=1;i<=N;i++){//枚举到第i中商品
                 for(int j=1;j<=M[i];j++){//枚举i类的每件配件
                     int b=B[i][j],p=P[i][j];


    // 分类讨论即可,枚举每种状态
    //dp[i+1][b]=max(dp[i+1][b],dp[i][b’]+p) 当前的b最小...其中b'>=b
    for(int bx=b;bx<=MaxB;bx++){ dp[i][b]=max(dp[i][b],dp[i-1][bx]+p); } //dp[i+1][b']=max(dp[i+1][b'],dp[i][b’]+p) 当前的b不是最小 ,其中b'<=b for(int bx=0;bx<=b;bx++){ dp[i][bx]=min(dp[i][bx],dp[i-1][bx]+p); } } }
    复杂度 N*M*maxB

    【代码】:

     1 #include <iostream>
     2 #include <string.h>
     3 #include <stdio.h>
     4 #define inf 99999999
     5 using namespace std;
     6 int dp[105][10005];//i件设备,最小带宽(瓶颈)为j时的最小花费
     7 int B[105][105];
     8 int P[105][105];
     9 int M[105],N;
    10 double fmax(double a,double b){
    11     if(a>b) return a;else return b;
    12 }
    13 int main()
    14 {
    15 //    freopen("out.txt","w",stdout);
    16     int t;
    17     scanf("%d",&t);
    18     while(t--){
    19         scanf("%d",&N);
    20         int MaxB=-1;
    21         for(int i=1;i<=N;i++){
    22             scanf("%d",&M[i]);
    23             for(int j=1;j<=M[i];j++){
    24                 scanf("%d%d",&B[i][j],&P[i][j]);
    25                 MaxB=max(MaxB,B[i][j]);
    26             }
    27         }
    28         for(int i=1;i<=N;i++){
    29             for(int j=0;j<=MaxB;j++) dp[i][j]=inf;
    30         }
    31         for(int i=0;i<=MaxB;i++) dp[0][i]=0;
    32 
    33         for(int i=1;i<=N;i++){
    34             for(int j=1;j<=M[i];j++){
    35                 int b=B[i][j],p=P[i][j];
    36                 //dp[i+1][b]=max(dp[i+1][b],dp[i][b’]+p) 当前的b最小...其中b'>=b
    37                 for(int bx=b;bx<=MaxB;bx++){
    38                     dp[i][b]=max(dp[i][b],dp[i-1][bx]+p);
    39                 }
    40                 //dp[i+1][b']=max(dp[i+1][b'],dp[i][b’]+p) 当前的b不是最小 ,其中b'<=b
    41                 for(int bx=0;bx<=b;bx++){
    42                     dp[i][bx]=min(dp[i][bx],dp[i-1][bx]+p);
    43                 }
    44             }
    45         }
    46         double ans=-1;
    47         for(int b=0;b<=MaxB;b++){
    48             ans=fmax(ans,(b+0.0)/dp[N][b]);
    49         }
    50 
    51         printf("%.3lf
    ",ans);
    52     }
    53 
    54     return 0;
    55 }
    View Code
  • 相关阅读:
    Mysql配置文件模板
    shell命令记录
    SuSE Linux Enterprise Server
    安装jdk1.8
    云南-第一个应用节点-ssh登录-卡顿的问题
    Python重新安装pip
    Centos6.5修改镜像为国内的阿里云源
    supervisord.conf
    Pandas连接Mysql数据库
    Vim速查命令简版
  • 原文地址:https://www.cnblogs.com/little-w/p/3775177.html
Copyright © 2011-2022 走看看