阿里巴巴笔试题--求数组中和为给定数所有的组合

原文地址:http://www.cublog.cn/u3/105033/showart_2236378.html

一、问题描述

给定一个数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。请设计一个高效算法实现这个需求。

二、解题思路

先将数据按从大到小进行排序,然后使用回溯法遍历所有可能。注意去掉重复的结果。

三、代码实现

  1. #include<iostream>  
  2. using namespace std;  
  3. int a[100]={4,3,2,2,1,1};  
  4. bool x[100];//标记第i个元素是否已经使用  
  5. int N=6;//元素个数  
  6. int t=4;//目标和  
  7. int sum;//当前和  
  8. int cmp(const void *a,const void *b)  
  9. {  
  10.     return *(int *)b-*(int *)a;  
  11. }  
  12. void backtrace(int n)  
  13. {  
  14.     if(sum>t)//当前和大于t  
  15.         return ;  
  16.     if(sum==t)//当前和等于t,输出结果  
  17.     {  
  18.         for(int j=0;j<n;++j)  
  19.         {  
  20.             if(x[j])  
  21.                 cout<<a[j]<<" ";  
  22.         }  
  23.         cout<<endl;  
  24.         return;  
  25.     }  
  26.     if(n==N)//超过n层  
  27.         return ;  
  28.     for(int i=n;i<N;++i)  
  29.     {  
  30.         if(x[i]==false)//未使用  
  31.         {  
  32.             x[i]=true;  
  33.             sum+=a[i];  
  34.             backtrace(i+1);  
  35.             x[i]=false;  
  36.             sum-=a[i];  
  37.             while(i<N-1 && a[i]==a[i+1])//跳过相同的  
  38.                 i++;  
  39.         }  
  40.     }  
  41. }  
  42. int main()  
  43. {  
  44.     sum=0;  
  45.     memset(x,0,sizeof(x));  
  46.     qsort(a,N,sizeof(a[0]),cmp);  
  47.     backtrace(0);  
  48.   
  49.     return 0;  
  50. }  

问题延伸:分解任意一个正整数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值