POJ 1018 Communication System (分组背包)

59 篇文章 0 订阅
9 篇文章 0 订阅

OJ题目:click here~~

题意分析:为一个通信系统购置n个不同的设备。每个设备可由m个生产厂商提供,不同的生产厂商提供的相同设备的brandwidth(带宽),price(价格)不同,求配置这个n个设备的最大性价比B/P , 即带宽/价格的最大值,带宽为所选设备的带宽最小值,价格为所选设备的价格总和。显然尽量使B大,P小。

可能用分组背包做。设dp[ i ][ k ] 为购置前 i 个设备 带宽最小为 k 的最小的价格总和。

则,dp[ i ][ k ] = min(dp[ i ][ k ] , dp[ i -  1][ k ]  + price[ i ][ j ]) ,其中,k <=  brandwidth[ i ][ j ] 。

最后,再从所有的dp[ n ][ i ]  中 , 找出最大性价比。

AC_CODE

int main(){
    int t;
    //freopen("in.txt","r",stdin);
    cin >> t;
    while(t--)
    {
        int n , m;
        int brandwidth[101][101];//带宽
        int price[101][101];//价格
        int mi[101];//第i种设备的m种选择
        int dp[101][1001];//dp[ i ][ k ] 为购置前 i 个设备 带宽最小为 k 的最小的价格总和
        memset(dp , 0x3f , sizeof(dp));
        int i , j ,k ,maxb = -1;
        cin >> n;
        for(i = 1;i <= n;i++)
        {
            cin >> mi[i];
            for(j = 1;j <= mi[i];j++)
            {
                cin >> brandwidth[i][j] >> price[i][j];
                if(brandwidth[i][j] > maxb) maxb = brandwidth[i][j];
            }
        }
        for(i = 1;i <= maxb;i++) dp[0][i] = 0;
        for(i = 1;i <= n;i++)//n设备
            for(j = 1;j <= mi[i];j++)//第i种设备的第j种选择
                for(k = 1;k <= brandwidth[i][j];k++)//最小带宽小于此带宽时,才能选择此带宽
                dp[i][k] = min(dp[i][k] , dp[i - 1][k] + price[i][j]);//价格和的最小值
        double ans = -1;
        for(i = 1;i <= maxb;i++)
            ans = max(ans , 1.0*i /dp[n][i]);//找最大性价比
        printf("%.3lf\n",ans);
    }

   return 0 ;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值