[贪心 + 分组背包]圆覆盖问题

一个包含n个圆心,每个圆半径都为r的位置坐标文件,你设计一个算法,找出m个圆心,使这m个圆总覆盖区域最大。

换个意思就是选择m个交集最小的圆

step1: 构建图:圆心为节点,有交集添边,边权为交集面积

step2: 简单bfs算法。目的把图分割为一个个连通图

step3: 直接选择孤立的节点.也就是不相交的节点。假设选了L个

step4:  若L >= m。则返回前m个圆心

step5: 把每组连通图贪心的删除节点。如包含p个节点的连通图,删除和其它圆交集最大圆,构成一个p-1个节点的子图。这个子图再删除一个相交最大圆,构成p-2个节点的子图。以此类推。 这些子图组成一组,体积v为节点个数,代价w为交集面积。

step6: 分组背包:背包体积V=m-L,按照step5分好的组装入背包。记录状态转移过程。对于每个w修改为max_w - w。

我们先来看分组背包问题

有N件物品和一个容量为V的背包,第i件物品的重量为c[i],价值为w[i],这些物品被划分成了若干组,每组中的物品互相冲突,最多选一件

问将哪些物品放入背包中可以使背包获得最大的价值

我们用f[k][v]表示前k种物品花费费用v所能取得的最大价值

给出状态转移方程:

f[k][v]=max{f[k-1][v],f[k-1][v-c[i]]+w[i]|物品i属于第k组}

实现:  

//注意这里是三层循环
for 所有的组k
  for v=V to 0
    for 所有属于组k的i
      f
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值