给定一个数t,以及n个整数,在这n个数中找到加和为t的所有组合
【题目】给定一个数t,以及n个整数,在这n个数中找到加和为t的所有组合,例如t = 4, n = 6,这6个数为 [4, 3, 2, 2, 1, 1],这样输出就有4个不同的组合它们的加和为4: 4, 3+1, 2+2, and 2+1+1. 请设计一个高效算法实现这个需求。-----阿里2011实习生笔试题
之前只是看了一下网上这个题的写法没自己动手写,以下为自己所写的程序。
注:此题可与创新工厂的那个题目(http://blog.csdn.net/zhizunwudi/article/details/11709115)对比着看一下,两者有点不同:本题数组中数字是有限的,而创新工场的那个题目每一个数字有无限个。
- int partition(int *a,int low,int high)
- {
- int pivotKey=a[low];
- while(low<high)
- {
- while (low<high && pivotKey<=a[high])
- high--;
- swap(a[low],a[high]);
- while(low<high && pivotKey>=a[low])
- low++;
- swap(a[low],a[high]);
- }
- return low;
- }
- void QSort(int *a,int low,int high)
- {
- if (low<high)
- {
- int pivot=partition(a,low,high);
- QSort(a,low,pivot);
- QSort(a,pivot+1,high);
- }
- }
- void QucikSort(int *a,int n)//自己写的快排
- {
- QSort(a,0,n-1);
- }
- void PrintCombination(int *a,int n,int sum,vector<int>& vec)
- { //a为输入数组,n为数组长度,sum为待查找的和,vec用于保存查找到的组合
- if (sum==0)
- {
- vector<int>::iterator iter=vec.begin();
- for (;iter!=vec.end();iter++)
- {
- cout<<*iter<<" ";
- }
- cout<<endl;
- return;
- }
- else if(sum<0 || n<=0)
- return;
- vec.push_back(a[0]);//a[0]即*a,注指针a是变化的,每次指向后一个
- PrintCombination(a+1,n-1,sum-a[0],vec);
- vec.pop_back();
- while(*a == *(a+1) && a < a+n) //【重要】跳过重复的数字
- a++;
- PrintCombination(a+1,n-1,sum,vec);
- }
- void main()
- {
- int a[8]={8,3,6,5,7,2,4,1};
- cout<<"原来的数组:";
- PrintArray(a,8);
- QucikSort(a,8);
- cout<<"排序后数组:";
- PrintArray(a,8);
- cout<<"-----------------------------"<<endl;
- vector<int> vec;
- int sum=10;
- cout<<"和为"<<sum<<"的组合如下:"<<endl;
- PrintCombination(a,8,sum,vec);
- }
【注】:感觉对数组“排序”的作用就是为了跳过重复的数字,如果没有重复数字,完全不需要对数组进行排序。
测试1:(排序情况)
测试2:(不排序情况,前提是无重复数字)
测试3:(不跳过重复数字)
测试4:(跳过重复数字)
给定一个数t,以及n个整数,在这n个数中找到加和为t的所有组合相关推荐
- 快速计算整数的二进制表示法中1的个数
快速计算整数的二进制表示法中1的个数 题目:给定一个无符号32位整数x,求x的二进制表示法中含1的个数? 第一种算法: int OneCount(unsigned int x) { for(int ...
- 给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。
笔者初涉<算法设计与分析>这门专业课,在做一些算法设计题的过程中遇到一些小感悟,特此记录和大家分享. 下面直接给出算法题目: 给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高 ...
- 测试整数(二进制)含1个数
引:中国某杀毒软件公司2010年3月笔试题 #include <iostream> using namespace std; int func(int n) {int nCount = 0 ...
- Java是否为整数_Java问题 输入一个数判定其是否为整数
输入一个数判定其是否为整数c++里面是if(a==int(a))请问JAVA里面怎么写?我是要判定这个开方之后是否为整数if(Math.sqrt(y)instanceofInteger)就这么写?意外 ...
- 利剑无意之如何判断一个数在40亿个整数中
如何判断一个数在40亿个整数中 首先思路:用一个set存储就好了,整数32位,一个整数4个字节,40亿个整数,应该是160亿个字节,大概16GB. 此刻问题又来了,我的机器只有2GB内存,但是需要尽可 ...
- ACM算法 -- 数论 -- 开灯关灯问题(数论,整数分解,因子个数,公式推导)
有编号1~100个灯泡,起初所有的灯都是灭的.有100个同学来按灯泡开关,如果灯是亮的,那么按过开关之后,灯会灭掉.如果灯是灭的,按过开关之后灯会亮. 现在开始按开关. 第1个同学,把所有的灯泡开关都 ...
- n个整数,其中有两个数是重复的,要求找出这两个重复的整数
n个整数,其中有两个数是重复的,要求找出这两个重复的整数 方法一 方法二 方法三 空间复杂度的计算 常量空间 线性空间 二维空间 递归空间 方法一 使用set集合 将每一个元素放到set集合中,加入的 ...
- 整数区间内整数的因子的个数
此计算区间内整数的因子的个数常用于计算阶乘(或者排列)尾部 0 的个数. 首先需要声明的是: 区间为整数的连续区间: 因子只有在作乘法运算时才有意义: 9 关于 3 的因子是 2 个,而不是 1 个( ...
- python求三个整数最大值_python 练习题:定义一个getMax()函数,返回三个数(从键盘输入的整数)中的最大值。...
此题比较简单,不做过多说明. 值得注意的是如何用一行代码让用户一次性输入为多个变量赋值 Python # 定义一个getMax()函数,返回三个数(从键盘输入的整数)中的最大值. def getMax ...
最新文章
- MySQL下优化SQL的一般步骤
- MySQL数据库-操作基础
- input的表单验证(不断更新中~~)
- PowerDesigner 使用的一些技巧
- 要配置php环境_只需修改,要配置Apache的PHP环境,只需修改()。
- c语言 printf_C语言(4) 屏幕输出指令printf
- OpenCV图像处理----图像的二值化
- WAP1.x协议栈浅析-WTP协议
- windows清理_10款欧美流行的Windows清理软件
- 车牌识别的matlab程序(程序_讲解_模板),车牌识别的matlab程序(程序-讲解-模板)资料...
- 如何使用SPSS列联表分析,查看变量间的相关关系(下)
- 美团点评 2019校园招聘 后台开发方向
- 冲向2021 荣耀“无限”创新
- swap分区,lvm的管理及计划任务
- 搜狗输入法For Linux
- 玩转肺癌目标检测数据集Lung-PET-CT-Dx ——④转换成PASCAL VOC格式数据集
- 【大话Mysql面试】-常见SQL语句书写
- 汇编idiv带符合除法指令。。。。
- RabbitMQ:消费者ACK机制、生产者消息确认
- 8086CPU有哪些寄存器组成?各有什么用途?标志寄存器的各标志位在什么情况下置位?