zoukankan      html  css  js  c++  java
  • 第 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 个元素进行排序就可以了。这里推荐冒泡排序实现。

  • 相关阅读:
    继承映射
    一对多,多对一,自关联的配置
    Spring 配置自动扫描spring bean配置
    Dao 处理
    2019暑假集训 括号匹配
    2019暑假集训 BLO
    2019暑假集训 Intervals
    2019暑假集训 平板涂色
    2019暑假集训 走廊泼水节
    0002-五层小山
  • 原文地址:https://www.cnblogs.com/scut-fm/p/3652236.html
Copyright © 2011-2022 走看看