阿里巴巴笔试题--求数组中和为给定数所有的组合
2011-07-13 16:35
357 查看
原文地址: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。请设计一个高效算法实现这个需求。二、解题思路先将数据按从大到小进行排序,然后使用回溯法遍历所有可能。注意去掉重复的结果。三、代码实现
问题延伸:分解任意一个正整数。
#include<iostream> using namespace std; int a[100]={4,3,2,2,1,1}; bool x[100];//标记第i个元素是否已经使用 int N=6;//元素个数 int t=4;//目标和 int sum;//当前和 int cmp(const void *a,const void *b) { return *(int *)b-*(int *)a; } void backtrace(int n) { if(sum>t)//当前和大于t return ; if(sum==t)//当前和等于t,输出结果 { for(int j=0;j<n;++j) { if(x[j]) cout<<a[j]<<" "; } cout<<endl; return; } if(n==N)//超过n层 return ; for(int i=n;i<N;++i) { if(x[i]==false)//未使用 { x[i]=true; sum+=a[i]; backtrace(i+1); x[i]=false; sum-=a[i]; while(i<N-1 && a[i]==a[i+1])//跳过相同的 i++; } } } int main() { sum=0; memset(x,0,sizeof(x)); qsort(a,N,sizeof(a[0]),cmp); backtrace(0); return 0; }
问题延伸:分解任意一个正整数。
相关文章推荐
- 阿里巴巴笔试题--求数组中和为给定数所有的组合
- 阿里巴巴笔试题--求数组中和为给定数所有的组合
- 阿里巴巴笔试题--求数组中和为给定数所有的组合
- 求数组中和为给定值的所有组合 (POJ 1564)
- 求数组中和为给定数所有的组合
- 求数组中和为给定数所有的组合
- 求数组中和为给定数的所有组合的个数
- 给定一个数组,求数组中所有元素的可能组合(每个元素只出现一次),使其和等于给定数的解决办法
- 算法题:求指定数组中和为N的出现的所有组合(二)
- 给定一个数组,n个数,打印所有可能的r位数的组合。例如{1,2,3,4}n=4,r=2.输出{1,2}{1,3}{1,4}{2,3}{2,4}{3,4}
- 求出数组中满足给定和的所有元素组合
- 给定一个数组,求数组中所有元素的可能组合(每个元素只出现一次),使其和等于给定数的解决办法
- [java大数据面试] 2018年4月百度面试经过+三面算法题:给定一个数组,求和为定值的所有组合.
- 给定一个无序整形数组,找出其中所以三个数之和为0的所有组合
- 算法题:求一个数组中和为sum的所有组合
- 给定一个正整数数组,找所有元素组合起来最大的值(答案)
- 找出数组中和为N+1的的所有组合
- 求数组中和为给定值的所有子序列
- 关于组合 - 给定数组,输出所有组合
- 笔试题:写一个有序整数数组两两之和等于某个数所有组合