algorithm - 将元素分配到有条件的 bin 中
问题描述
给定一个集合
struct Person {
string name;
int team;
bool swimmer;
};
vector<Person> people;
是否有一种“众所周知的”算法可以将它们分配到具有以下条件的最少数量的固定大小的 bin 中:
- 同一个垃圾箱中的两个人不能来自同一个团队
- 每个垃圾箱中至少有一个人必须是游泳者
我正在寻找一种解决方案,该解决方案具有容纳每个人所需的最少垃圾箱数量。垃圾箱不必完全装满。
如果一半是游泳者并且垃圾箱大小为四个,最简单的解决方案是将一名游泳者与一名非游泳者放在一起。然而,最有效的解决方案是将两名游泳者和两名非游泳者放在一个垃圾箱中(团队成员允许)。
不同团队的数量可能大于一个垃圾箱的大小,因此会有很多解决方案。
显然,如果people.size() / bin_size > number of swimmers
,将没有解决方案。
解决方案
它似乎是装箱问题的变体。
这是一个 NP 完全问题,但文献中有很多算法可以解决它,包括在线和离线方法。
在您的情况下,您事先知道数据,因此您可能需要首次拟合递减 (FFD) 算法或其修改版本,它最多在O(nlog(n))
.
您必须修改标准算法以引入约束。
推荐阅读
- python - 找到最陡坡的起点和终点
- apollo - 为 Refetch 查询设置自定义标头 ApolloGraphQL
- nuxt.js - 从 localStorage 加载 vuex 存储需要很长时间
- javascript - 如何在 React 中将 props 道具从 Parent 传递给 this.props.children
- angular - 当我重新打开浏览器时,ios 生产模式下的 Angular 将不起作用
- python - 使用 Eclipse Pydev 打开 dtale 时浏览器上的 ERR_CONNECTION_REFUSED
- c - 如何在自写 nginx 模块中访问完整位置路径(带有外部位置)?
- android - 我需要在被调用的类中显示一个简单的 AlertDialog
- javascript - 使用自定义 JS 检查 WPDataTables URL?
- python - 如何在 Python 3 中使用 `-F` 复制`curl`?