分析:此题有两个坑,一是这里的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个数的组合。的更多相关文章

  1. 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 ...

  2. 算法系列:寻找最大的 K 个数

    Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...

  3. 第2章 数字之魅——寻找最大的K个数

    寻找最大的K个数 问题描述 在面试中,有下面的问答: 问:有很多个无序的数,我们姑且假定它们各不相等,怎么选出其中最大的若干个数呢? 答:可以这样写:int array[100] …… 问:好,如果有 ...

  4. 寻找最小(最大)的k个数

    题目描述:输入n个整数,输出其中最小的k个元素. 例如:输入1,2,3,4,5,6,7,8这8个数字,则最小的4个数字为1,2,3,4. 思路1:最容易想到的方法:先对这个序列从小到大排序,然后输出前 ...

  5. 03寻找最小的k个数

    题目描述:查找最小的k个元素         题目:输入n个整数,输出其中最小的k个.         例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. 1:最简单 ...

  6. Java实现k个数乘(cheng)(自然数的k乘积问题)

    k个数乘(cheng) 题目描述 桐桐想把一个自然数N分解成K个大于l的自然数相乘的形式,要求这K个数按从小到大排列,而且除了第K个数之外,前面(K-l)个数是N分解出来的最小自然数.例如:N=24, ...

  7. O(N)的时间寻找最大的K个数

    (转:http://www.cnblogs.com/luxiaoxun/archive/2012/08/06/2624799.html) 寻找N个数中最大的K个数,本质上就是寻找最大的K个数中最小的那 ...

  8. 剑指offer 面试题40. 最小的k个数

    O(N)划分法,注意这个方法会改变原数据(函数参数是引用的情况下)!当然也可以再定义一个新容器对其划分 要求前k小的数,只要执行快排划分,每次划分都会把数据分成大小两拨.直到某一次划分的中心点正好在k ...

  9. 编程题目: 找出最小的k个数

    找出最小或者最大的几个数我使用的是堆排序,效率为0(nlgn) 构建小顶堆返回末尾的k个数 或者 构建大顶堆返回前k个数 #!/usr/bin/env python3 def heap_sort(ar ...

随机推荐

  1. 获取Avrix上Computer Vision and Pattern Recognition的论文,进一步进行统计分析。

    此文主要记录我在18年寒假期间,收集Avrix论文的总结 寒假生活题外   在寒假期间,爸妈每天让我每天跟着他们6点起床,一起吃早点收拾,每天7点也就都收拾差不多.   早晨的时光是人最清醒的时刻,而 ...

  2. [SCOI 2016]美味

    Description 题库链接 给你一个长度为 \(n\) 的序列 \(A\) . \(m\) 组询问 \((b,x,l,r)\) 询问 \[\max_{i=l}^r b\oplus (A_i+x) ...

  3. [POJ 3728]The merchant

    Description There are N cities in a country, and there is one and only one simple path between each ...

  4. SRM340 VegetableGarden

    Description 你的蔬菜园形成了一个矩形网格.你决定检查一些小块土地.从左上角开始,你将走过菜园,回到起点.现在你想要检查一下菜园内的田地,于是你决定从左上角出发,在菜园里走一圈回到原处.最后 ...

  5. NOIWC2018 游记

    day1 上午是自习,做了一些杂题,看了一下ppt,中午准备了一下行李,就出发了,提前了一个小时,谁知道被坑爹导航弄得居然到晚了一点 当走到这里的时候我愣住了 纠结了一分钟,直到有个boy走了进去,我 ...

  6. 洛谷P1856 [USACO5.5]矩形周长Picture

    题目背景 墙上贴着许多形状相同的海报.照片.它们的边都是水平和垂直的.每个矩形图片可能部分或全部的覆盖了其他图片.所有矩形合并后的边长称为周长. 题目描述 编写一个程序计算周长. 如图1所示7个矩形. ...

  7. [UOJ UNR #2]积劳成疾

    来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 区间最大值的题emmmm 想到构建笛卡尔树,这样自然就想到了一种dp f[i][j]表示大小为i的笛卡尔树,根的权值是j的答案. 转移 ...

  8. bzoj2127

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 2492  Solved: 1205[Submit][Status][D ...

  9. Atom 编辑器安装 linter-eslint 插件,并配置使其支持 vue 文件中的 js 格式校验

    安装方式有如下几种. 1.最常用的安装方式. # 进入atom插件文件夹 cd ~/.atom/packages/ # git clone 插件源文件 git clone https://github ...

  10. C++ C# python 中输入输出函数对比

    C++ cin>>"nihao";cout<<"nihao"<<endl; C# System.Console.ReadLi ...