从小于或等于某个 N 的数字列表中最小化或找到 n 个理想的子集和
Minimize or find a n ideal subset-sums from a list of numbers which are less than or equal to some N
给定一个数字列表,lst = [1, 1, 2, 4, 3, 2, 1, 1, 1, 2, 1, 4, 3, 1]
如何找到小于或等于 4 的理想列表数?
这里有很多可能性。目标是尽量减少可能的列表数。程序需要创建如下所示的子集列表:{4}, {4}, {3, 1}, ... , {1, 1}
.
请注意,最后一个列表子集不等于 4,但更少。由于以下原因,此问题很困难:
- 程序必须能够找到小于或等于总和的
subset-sums
- 程序需要首先通过查看最大值将值从原始列表中删除为子集列表
这是我的尝试。 一般的想法是对列表进行排序,从左到右,每次迭代都贪婪地选择最大的子集。时间复杂度O(n)
。
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
std::vector<int> lst{1, 1, 2, 4, 3, 2, 1, 1, 1, 2, 1, 4, 3, 1};
std::sort(lst.begin(),lst.end()); //sort the list
int target = 4;
int left = 0;
int right = lst.size()-1;
std::vector<std::vector<int>> solutions;
while (left<right ){
if(lst[left] > target) // break if no solutions
break;
if(lst[right] > target) // ignore larger right values
right--;
if(lst[right]<=target){ // while the total sum is less than target, keep adding the elements
std::vector<int> subset;
subset.push_back(lst[right]);
int sum = lst[right];
while(left<right && lst[left]+sum<=target){
sum+=lst[left];
subset.push_back({lst[left]});
left++;
}
solutions.push_back(subset);
right--;
}
}
for(auto& ss : solutions){
std::cout<<'{';
for(auto n:ss){
std::cout<<n<<',';
}
std::cout<<"b}";
std::cout<<std::endl;
}
}
相关文章:
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 在子集化后将包含索引号的列表列表映射到标准索引序列
- 显示字符串的集合和子集
- 对于四轴飞行器,PID中I控制器的理想值应该是多少
- 用于子集字符串的 Rcpp 函数
- 将数据放在私有类中是否理想?(C++)
- 为什么我的子集和方法不正确?
- 计算总和为 x 的所有整数子集(包括负数)
- 每个文件(理想情况下是每个部分)的 clang 格式样式覆盖
- 代码编译但不起作用!cmd窗口只是理想和理想,但什么也没发生
- 在尝试使用递归查找集合子集的总数时,我遇到了分割错误
- 从小于或等于某个 N 的数字列表中最小化或找到 n 个理想的子集和
- 使用 Rcpp 的高效矩阵子集
- 返回给定 SEXP 的子集,而无需知道实际的内部数据类型
- 使用递归从子集和中查找最大和
- 如何获得比较两个向量对的子集
- 实现伪多项式DP子集和
- 现代编译器会优化只引用对象子集的局部变量吗
- 类方法子集的惰性评估
- 对于可重定位的多平台安装,理想的 cmake 安装目录结构是什么?