一个包含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