第 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 个元素进行排序就可以了。这里推荐冒泡排序实现。

原文地址:https://www.cnblogs.com/scut-fm/p/3652236.html