有n个数,输出其中所有和为s的k个数的组合。
分析:此题有两个坑,一是这里的n个数是任意给定的,不一定是:1,2,3...n,所以可能有重复的数(如果有重复的数怎么处理?);二是不要求你输出所有和为s的全部组合,而只要求输出和为s的k个数的组合。
举个例子,假定n=6,这6个数为:1 2 1 3 0 1,如果要求输出和为3的全部组合的话,
- 1 2
- 1 2 0
- 0 3
- 1 1 1
- 1 1 1 0
而题目加了个限制条件,若令k=2,则只要求输出:[{1,2}, {0,3}] 即可。
#include <iostream> #include<list> #include<vector> using namespace std; #define SUM 20 #define SIZE 10 #define K 3 #define HASHSIZE 9 list<int> mylist; vector<int> hashvector; void initRandom(int* arr) { srand(unsigned(time(0))); for (int i = 0; i < SIZE; i++) { arr[i] = rand() % 10; } for (int i = 0; i < SIZE; i++) { cout << " " << arr[i]; } cout << endl; } int getCurHash() { int hash = 0; for (list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it) { hash |= (1 << *it); } return hash; } void sumOfkNum(int sum, int*arr, int i, bool &flag) { if (sum <= 0 || i == SIZE) { return; } if (sum == arr[i] && mylist.size() == K - 1) { int hash = getCurHash() | (1 << arr[i]); if (find(hashvector.begin(), hashvector.end(), hash) == hashvector.end()) { hashvector.push_back(hash); for (list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it) { cout << *it << "+"; } cout << arr[i] << endl; } else { return; } } else { if (mylist.size() > K) { return; } mylist.push_back(arr[i]); sumOfkNum(sum - arr[i], arr, i + 1, flag); mylist.pop_back(); sumOfkNum(sum, arr, i + 1, flag); } } int main() { int* arr = new int[SIZE]; bool flag = false; initRandom(arr); sumOfkNum(SUM, arr, 0, flag); if (hashvector.empty()) { cout << "no result" << endl; } return 0; }
有n个数,输出其中所有和为s的k个数的组合。的更多相关文章
- Gym 101064 D Black Hills golden jewels 【二分套二分/给定一个序列,从序列中任意取两个数形成一个和,两个数不可相同,要求求出第k小的组合】
D. Black Hills golden jewels time limit per test 2 seconds memory limit per test 256 megabytes input ...
- 算法系列:寻找最大的 K 个数
Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...
- 第2章 数字之魅——寻找最大的K个数
寻找最大的K个数 问题描述 在面试中,有下面的问答: 问:有很多个无序的数,我们姑且假定它们各不相等,怎么选出其中最大的若干个数呢? 答:可以这样写:int array[100] …… 问:好,如果有 ...
- 寻找最小(最大)的k个数
题目描述:输入n个整数,输出其中最小的k个元素. 例如:输入1,2,3,4,5,6,7,8这8个数字,则最小的4个数字为1,2,3,4. 思路1:最容易想到的方法:先对这个序列从小到大排序,然后输出前 ...
- 03寻找最小的k个数
题目描述:查找最小的k个元素 题目:输入n个整数,输出其中最小的k个. 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. 1:最简单 ...
- Java实现k个数乘(cheng)(自然数的k乘积问题)
k个数乘(cheng) 题目描述 桐桐想把一个自然数N分解成K个大于l的自然数相乘的形式,要求这K个数按从小到大排列,而且除了第K个数之外,前面(K-l)个数是N分解出来的最小自然数.例如:N=24, ...
- O(N)的时间寻找最大的K个数
(转:http://www.cnblogs.com/luxiaoxun/archive/2012/08/06/2624799.html) 寻找N个数中最大的K个数,本质上就是寻找最大的K个数中最小的那 ...
- 剑指offer 面试题40. 最小的k个数
O(N)划分法,注意这个方法会改变原数据(函数参数是引用的情况下)!当然也可以再定义一个新容器对其划分 要求前k小的数,只要执行快排划分,每次划分都会把数据分成大小两拨.直到某一次划分的中心点正好在k ...
- 编程题目: 找出最小的k个数
找出最小或者最大的几个数我使用的是堆排序,效率为0(nlgn) 构建小顶堆返回末尾的k个数 或者 构建大顶堆返回前k个数 #!/usr/bin/env python3 def heap_sort(ar ...
随机推荐
- JDBC查询优化,统计条数
JDBC查询优化分析: 现有以下查询语句: String sql1 = "select * from userinfo";// 创建语句 String sql2 = "s ...
- [USACO 08JAN]Telephone Lines
Description Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone compa ...
- [NOIp 2016]换教室
Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 $2n$ 节课程安排在 $n$ 个时间段上.在第 $i$($1 \leq ...
- bzoj4896 补退选
Description X是T大的一名老师,每年他都要教授许多学生基础的C++知识.在T大,每个学生在每学期的开学前都需要选课,每 次选课一共分为三个阶段:预选,正选,补退选:其中"补退选& ...
- codefroces 911G Mass Change Queries
题意翻译 给出一个数列,有q个操作,每种操作是把区间[l,r]中等于x的数改成y.输出q步操作完的数列. 输入输出格式 输入格式: The first line contains one intege ...
- 【HDU 1576】 A/B
Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1). Input 数据的 ...
- [USACO 5.1.3]乐曲主题
Description 我们用N(1 <= N <=5000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,每个数表示钢琴上的一个键.很不幸这种表示旋律的方法忽略了音符的 ...
- Centos下出现read-only file system 的解决办法
Centos下出现这种情况说明磁盘只能读不能写,出现这种情况一般是因为不正常的关机或者硬盘损坏导致磁盘挂载出现问题. 本萌新也遇到了这个问题,尝试了各种命令都不行,最后用了mount -o remou ...
- HTTP 协议详解(超级经典)-转
什么是HTTP协议 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端 ...
- jquery form提交
$('#form').form("submit", { url: "Stu_sendsms.aspx", onSubmit: function () { $(' ...