【题目】给定一个数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)对比着看一下,两者有点不同:本题数组中数字是有限的,而创新工场的那个题目每一个数字有无限个。

[cpp]  view plain  copy
  1. int partition(int *a,int low,int high)
  2. {
  3. int pivotKey=a[low];
  4. while(low<high)
  5. {
  6. while (low<high && pivotKey<=a[high])
  7. high--;
  8. swap(a[low],a[high]);
  9. while(low<high && pivotKey>=a[low])
  10. low++;
  11. swap(a[low],a[high]);
  12. }
  13. return low;
  14. }
  15. void QSort(int *a,int low,int high)
  16. {
  17. if (low<high)
  18. {
  19. int pivot=partition(a,low,high);
  20. QSort(a,low,pivot);
  21. QSort(a,pivot+1,high);
  22. }
  23. }
  24. void QucikSort(int *a,int n)//自己写的快排
  25. {
  26. QSort(a,0,n-1);
  27. }
  28. void PrintCombination(int *a,int n,int sum,vector<int>& vec)
  29. {   //a为输入数组,n为数组长度,sum为待查找的和,vec用于保存查找到的组合
  30. if (sum==0)
  31. {
  32. vector<int>::iterator iter=vec.begin();
  33. for (;iter!=vec.end();iter++)
  34. {
  35. cout<<*iter<<" ";
  36. }
  37. cout<<endl;
  38. return;
  39. }
  40. else if(sum<0 || n<=0)
  41. return;
  42. vec.push_back(a[0]);//a[0]即*a,注指针a是变化的,每次指向后一个
  43. PrintCombination(a+1,n-1,sum-a[0],vec);
  44. vec.pop_back();
  45. while(*a == *(a+1) && a < a+n) //【重要】跳过重复的数字
  46. a++;
  47. PrintCombination(a+1,n-1,sum,vec);
  48. }
  49. void main()
  50. {
  51. int a[8]={8,3,6,5,7,2,4,1};
  52. cout<<"原来的数组:";
  53. PrintArray(a,8);
  54. QucikSort(a,8);
  55. cout<<"排序后数组:";
  56. PrintArray(a,8);
  57. cout<<"-----------------------------"<<endl;
  58. vector<int> vec;
  59. int sum=10;
  60. cout<<"和为"<<sum<<"的组合如下:"<<endl;
  61. PrintCombination(a,8,sum,vec);
  62. }

【注】:感觉对数组“排序”的作用就是为了跳过重复的数字,如果没有重复数字,完全不需要对数组进行排序。

测试1:(排序情况)

测试2:(不排序情况,前提是无重复数字)

测试3:(不跳过重复数字)

测试4:(跳过重复数字)

给定一个数t,以及n个整数,在这n个数中找到加和为t的所有组合相关推荐

  1. 快速计算整数的二进制表示法中1的个数

    快速计算整数的二进制表示法中1的个数 题目:给定一个无符号32位整数x,求x的二进制表示法中含1的个数? 第一种算法: int OneCount(unsigned int x) {   for(int ...

  2. 给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。

    笔者初涉<算法设计与分析>这门专业课,在做一些算法设计题的过程中遇到一些小感悟,特此记录和大家分享. 下面直接给出算法题目: 给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高 ...

  3. 测试整数(二进制)含1个数

    引:中国某杀毒软件公司2010年3月笔试题 #include <iostream> using namespace std; int func(int n) {int nCount = 0 ...

  4. Java是否为整数_Java问题 输入一个数判定其是否为整数

    输入一个数判定其是否为整数c++里面是if(a==int(a))请问JAVA里面怎么写?我是要判定这个开方之后是否为整数if(Math.sqrt(y)instanceofInteger)就这么写?意外 ...

  5. 利剑无意之如何判断一个数在40亿个整数中

    如何判断一个数在40亿个整数中 首先思路:用一个set存储就好了,整数32位,一个整数4个字节,40亿个整数,应该是160亿个字节,大概16GB. 此刻问题又来了,我的机器只有2GB内存,但是需要尽可 ...

  6. ACM算法 -- 数论 -- 开灯关灯问题(数论,整数分解,因子个数,公式推导)

    有编号1~100个灯泡,起初所有的灯都是灭的.有100个同学来按灯泡开关,如果灯是亮的,那么按过开关之后,灯会灭掉.如果灯是灭的,按过开关之后灯会亮. 现在开始按开关. 第1个同学,把所有的灯泡开关都 ...

  7. n个整数,其中有两个数是重复的,要求找出这两个重复的整数

    n个整数,其中有两个数是重复的,要求找出这两个重复的整数 方法一 方法二 方法三 空间复杂度的计算 常量空间 线性空间 二维空间 递归空间 方法一 使用set集合 将每一个元素放到set集合中,加入的 ...

  8. 整数区间内整数的因子的个数

    此计算区间内整数的因子的个数常用于计算阶乘(或者排列)尾部 0 的个数. 首先需要声明的是: 区间为整数的连续区间: 因子只有在作乘法运算时才有意义: 9 关于 3 的因子是 2 个,而不是 1 个( ...

  9. python求三个整数最大值_python 练习题:定义一个getMax()函数,返回三个数(从键盘输入的整数)中的最大值。...

    此题比较简单,不做过多说明. 值得注意的是如何用一行代码让用户一次性输入为多个变量赋值 Python # 定义一个getMax()函数,返回三个数(从键盘输入的整数)中的最大值. def getMax ...

最新文章

  1. MySQL下优化SQL的一般步骤
  2. MySQL数据库-操作基础
  3. input的表单验证(不断更新中~~)
  4. PowerDesigner 使用的一些技巧
  5. 要配置php环境_只需修改,要配置Apache的PHP环境,只需修改()。
  6. c语言 printf_C语言(4) 屏幕输出指令printf
  7. OpenCV图像处理----图像的二值化
  8. WAP1.x协议栈浅析-WTP协议
  9. windows清理_10款欧美流行的Windows清理软件
  10. 车牌识别的matlab程序(程序_讲解_模板),车牌识别的matlab程序(程序-讲解-模板)资料...
  11. 如何使用SPSS列联表分析,查看变量间的相关关系(下)
  12. 美团点评 2019校园招聘 后台开发方向
  13. 冲向2021 荣耀“无限”创新
  14. swap分区,lvm的管理及计划任务
  15. 搜狗输入法For Linux
  16. 玩转肺癌目标检测数据集Lung-PET-CT-Dx ——④转换成PASCAL VOC格式数据集
  17. 【大话Mysql面试】-常见SQL语句书写
  18. 汇编idiv带符合除法指令。。。。
  19. RabbitMQ:消费者ACK机制、生产者消息确认
  20. 8086CPU有哪些寄存器组成?各有什么用途?标志寄存器的各标志位在什么情况下置位?

热门文章

  1. python 16bit转8bit的工具_wav文件16bit量化比特转8bit量化比特
  2. http缓存中,强缓存和协商缓存的区别?
  3. Vue中scope的作用
  4. 3.4进阶:用getchar()输入数据存在的问题(含错误案例分析)
  5. 阿里云OSS后台实现远程文件上传下载
  6. 前端深拷贝与浅拷贝(附实现方法)
  7. 解决macOS 13 Venture beta4、beta5的CPU占用高、风扇狂转的问题
  8. 双足步行机器人的ZMP与CoP检测
  9. Cesium简介及发展历史
  10. 全民学python,现连小学生都开始内卷起来了!