|
楼主 |
发表于 2024-3-18 07:15:32
|
显示全部楼层
- // 结果容器类型,保存组合和剩余元素对
- using CombinationResult = std::pair<std::vector<double>, std::vector<double>>;
- // 获取n个元素的所有组合(不重复),并返回包含组合及剩余元素的向量
- std::vector<CombinationResult> getCombinationsAndRemaining(const std::vector<double>& input, int n) {
- std::vector<CombinationResult> results;
- std::unordered采用set<double> selected采用elements;
- // 回溯法生成所有组合
- for (size采用t i = 0; i < input.size(); ++i) {
- if (selected采用elements.find(input[i]) == selected采用elements.end()) { // 没有选过这个元素
- selected采用elements.insert(input[i]);
-
- // 当组合数量达到n时,添加当前组合到结果列表,并开始处理剩余元素
- if (results.empty() || results.back().first.size() < n) {
- results.back().first.push采用back(input[i]);
- if (results.back().first.size() == n) {
- // 复制原始输入向量以获得剩余元素
- std::vector<double> remaining(input);
- // 移除已选择的元素
- for (double val : results.back().first) {
- remaining.erase(std::remove(remaining.begin(), remaining.end(), val), remaining.end());
- }
- results.back().second = remaining;
- }
- } else {
- results.emplace采用back({input[i]}, std::vector<double>());
- }
- // 继续生成包含input[i]的其他组合
- auto sub采用results = getCombinationsAndRemaining(input, n);
- results.reserve(results.size() + sub采用results.size());
- for (auto& sub采用result : sub采用results) {
- results.push采用back(sub采用result);
- }
- // 回溯:移除刚刚添加的元素
- selected采用elements.erase(input[i]);
- }
- }
- return results;
- }
- int main() {
- std::vector<double> vec = {1.0, 2.0, 3.0, 4.0, 5.0};
- int n = 2;
- std::vector<CombinationResult> combinations采用and采用remainings = getCombinationsAndRemaining(vec, n);
- // 打印每个组合及对应的剩余值
- for (const auto& result : combinations采用and采用remainings) {
- std::cout << "组合: ";
- for (double value : result.first) {
- std::cout << value << " ";
- }
- std::cout << "剩余元素: ";
- for (double value : result.second) {
- std::cout << value << " ";
- }
- std::cout << std::endl;
- }
- return 0;
- }
复制代码 |
|