Poj 1018 通讯系统

题意大致是,需要制作一个通讯系统,这个通讯系统需要n种模块(1-100),第i个模块有mi(1-100)家供应商,每种模块需要一个,供应商的模块有两个参数,带宽B和价格P。现在,我要选择n个模块,每个模块可以从给出了mi家厂商任意选取。最后系统的带宽B是n个里面最小的那个决定,价格为n个模块价格P之和。求能够选择的最大BP比。

题目介绍完了,接下来讲讲思路。这道题我用了动态规划去解决。
最后要求的是最大BP比,那么重要的两个参数就是最后系统的价钱P和带宽B。之前的思路一直局限于加入每个模块之后的最优BP比,但是这样的话并不容易实现。而动态规划其实就是一种聪明的分步枚举。思路这样想:

利用动态规划,就要分治求解。最后我们需要的是最优BP比,那么我们有两种选择:
1. 分治计算最优BP比,那么层级之间将很难传递最优结果。因为新加入模块之后的新的BP比不容易计算。
2. 分治计算价格,和带宽。
现在思考,如果计算结果在每层之间传递的话,计算第i层就需要用到第i-1层的记录,那么,我们需要i-1层留下什么信息呢?
如果每层计算最优BP比,那么上一层的最优BP比对这一层有什么用呢?我们不能简单的用每层的BP比去进行计算,因为不同的B选择会导致前面所有的B发生变化,这是非常麻烦的,动态的。所以最好找一种本层选择不会影响到前面的结果的属性。显然,最优BP比已经被淘汰了。
那么考虑总价格和带宽。首先,如果可行,那么最后一层会得到一组带宽和价格,我们可以从中得到题目最终要求的最大BP比。接下来想,最优值如何传递。
首先,带宽是会改变的,带宽在层之间的改变规则是:本层出现的模块带宽,可以匹配上一层系统带宽大于等于模块带宽的子系统,价格=上一层带宽大于该模块的子系统们的最小价格+该模块价格。而本层没有出现的带宽,也是可以出现在系统中的,这就是上一层系统中的带宽,这样的子系统加上一个本层的带宽大于它的模块,就组成了一个子系统,价格则是上层系统价格+本层大于其的最便宜模块价格。
所以,我们选择计算每层的带宽和价格。具体的是计算出各种带宽可能性,记录最便宜的价格。使用dp[i][j]代表第i层、带宽为j的系统最小价格。问题解决。

其实这样挺麻烦,因为开数组的话,需要遍历j来判断有哪些带宽取值,如果用set记录出现的带宽,则更好。
这里有一个陷阱,如果上层系统和本层都拥有某个带宽,那么选择哪个转化规则呢?我这里想的是,两个都算一下选小的。但是,代码采用了第一种模式,也AC了,可能是数据有漏洞。

# include<iostream>
#pragma warning(disable:4996)
using namespace std;
int B[
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值