第 2 章 第 8 题 最小子集和问题 排序法实现
问题分析
输入:一个 n 元数组,元素和 t,元素个数 k。
输出:存在 or 不存在 k 个元素其和小于 t
约束:无
解答思路
将数组按从小到大的顺序进行排序,然后判断这 k 个元素的和于 t 的大小关系。若其和小于 t 则此数组存在 k 个元素其和小于 t,否则不存在。
代码实现
#include <iostream> #include <vector> #include <algorithm> #include <numeric> using namespace std; // 输出数组 void print(vector<int> &v); // 判断数组中是否存在 k 个元素小于 t bool judge(vector<int> v, int k, int t); int main() { // 初始化数组 vector<int> v; int n; cout << "请输入数组大小: " << endl; cin >> n; int num; cout << "请输入数组元素,如 \"1 2 3\":" << endl; for (int i=0; i<n; i++) { cin >> num; v.push_back(num); } cout << "数组构造完成" << endl; // 获取 k 和 t 的值 cout << "请输入 k 值: " << endl; int k; cin >> k; if (k > n) { cout << "k 值非法" << endl; return 1; } cout << "请输入 t 值: " << endl; int t; cin >> t; // 打印结果 cout << "在如下数组中:" << endl; print(v); if (judge(v, k, t) == true) cout << endl << "存在 " << k << " 个元素的元素和小于 " << t << " " << endl; else cout << endl << "不存在 " << k << " 个元素的元素和小于 " << t << " " << endl; return 0; } void print(vector<int> &v) { for (vector<int> :: iterator it = v.begin(); it != v.end(); it++) cout << *it << " "; } bool judge(vector<int> v, int k, int t) { // 排序 sort(v.begin(), v.end()); // 求前面 k 个元素的和 int sum = accumulate(v.begin(), v.begin()+k, 0); if (sum >= t) return false; else return true; }
运行测试
小结
1. 很多问题的根源都是查找和排序的问题
2. 为了表述方便,本文中代码采用C++标准算法实现 - 对整个数组进行了排序。事实上只需要对前 k 个元素进行排序就可以了。这里推荐冒泡排序实现。