算法题:求指定数组中和为N的出现的所有组合(二)

#include <iostream>
#include <malloc.h>
using namespace std;

void deal_sum(int a[],int n,int val)
{
    int count = 1;
    int m = n;
    int *b= (int*)calloc(0,n);
    while(m--)
    {
        count*=2;
    }
    while(count--)
    {
        for(int i=0;i<n;i++)
        {
            if(0==b[i])
                b[i]=1;
            else
                {
                b[i]=0;
                break;
                }
        }
        int sum = 0;
        for(int i=0;i<n;i++)
        {
            if(b[i]==1)sum+=a[i];
        }
        if(sum==val)
        {
            for(int i=0;i<n;i++)
            {
                if(b[i]==1)
                cout<<a[i]<<" ";
            }
            cout<<endl;
        }
    }
}
int main()
{
    int a[]={1,2,3,4,5,6,7};
    deal_sum(a,sizeof(a)/sizeof(int),7);
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-09 03:16:22

算法题:求指定数组中和为N的出现的所有组合(二)的相关文章

KMP算法中求next数组的实质

在串匹配模式中,KMP算法较蛮力法是高效的算法,我觉得其中最重要的一点就是求next数组: 看了很多资料才弄明白求next数组是怎么求的,我发现我的忘性真的比记性大很多,每次看到KMP算法求next数组都得花很长时间去看怎么求,虽然看了很多遍了,但还是容易忘,所以我今天非得把它记下来,这样我下次看到的时候就可以直接看我的总结了,哈,可恶的记性,总是这么不争气.设目标串为S,需要匹配串为T: next[j]数组生成的实质:     next[j]数组的值其实就等于串T1T2...Tj-1中相同的前

算法题:求一个数组中和为sum的所有组合

#include <iostream> #include <list> using namespace std; void Get_Sum(int sum,int n,int a[],list<int>& lst) { if(sum<=0 || n<0)return; if(sum==a[n]) { lst.push_back(a[n]); list<int> :: iterator it = lst.begin(); while(it!

[程序员面试题精选100题]10.排序数组中和为给定值的两个数字

扩展(1):输入一个数组,判断这个数组中是不是存在三个数字i, j, k,满足i+j+k等于0. 扩展(2):如果输入的数组是没有排序的,但知道里面数字的范围,其他条件不变,如何在O(n)时间里找到这两个数字?这个的基本思路是先用哈希表实现O(n)的排序(请参照本面试题系列的第57题),接下来的步骤都一样了.

算法题19 把数组排成最小的数

题目 输入一个正整数数组,将他们连接起来排成一个数,输出所有排出的数字中最小的一个.例如:输入数组[32,321],输出所能排出的最小数为:32132.请给出该问题的算法. 分析 对于元素位置排列的问题,如a,b,我们希望找到一种排列规则,来确定我们所要得到的是a,b还是b,a. 题目要求得到所能排出的最小的数,那如a<b,则从常识来看ab<ba.这个比较规则到底正不正确呢?在剑指offer一书中有很好的证明 http://zhedahht.blog.163.com/blog/static/2

【趣味算法题】在数组中,对于所有元素,找出比当前元素大的下一个元素

在数组中,对于所有元素,找出比当前元素大的下一个元素 意思就是,eg.  数组为 3 1 2 5 4 6 7 那么我们需要得到的结果应该是  5 2 5 6 6 7 -1 解决方法如下: 暴力匹配: O (n ^ 2 ) 的效率对所有元素匹配过去,效率非常的低 经过提示, 我想到的一种 O ( nlg n ) 效率的算法 只需要对数组扫描一次,我们用一个 Priority_queue 来得到当前最小的元素 Prority_queue 存放的数据结构为: struct sc { int key,

突现灵感想出较新简单算法--实现求一数组最大子数组的和

一.题目: 返回一个整数数组中最大子数组的和. 要求: 1.输入一个整形数组,数组里有正数也有负数. 2.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 3.求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思路 首先将每一点看成辐射源,没点只能向右辐射找出所有可能的子数组求出最大值,如arr[5]={1,2,3,4,5}.首先1与1+2与1+2+3....到1+2+3+4+5找出最大值存入数组a[0]中. 再由2向右辐射找出所有可能的子数组求出最大值存入a[1]以

[程序猿面试题精选100题]10.排序数组中和为给定值的两个数字

剑指Offer之和为S的两个数字 剑指Offer之和为S的连续正数序列 扩展(1):输入一个数组,推断这个数组中是不是存在三个数字i, j, k,满足i+j+k等于0. 扩展(2):假设输入的数组是没有排序的,但知道里面数字的范围,其它条件不变,怎样在O(n)时间里找到这两个数字?这个的基本思路是先用哈希表实现O(n)的排序(请參照本面试题系列的第57题).接下来的步骤都一样了.

算法题:将一个数组中所有奇数放前面和偶数放后面(不开辟新的内存空间)

package arithmetic; import java.util.Arrays; public class OddAndEven { public static void main(String[] args) { int [] a={5,10,26,32,41,7,9,8,4,12,1};; int low = 0; int high = a.length-1; /**想法: * 1.遍历.将奇数放在左边,偶数放在右边 * 2.先遍历左边,直到出现不是奇数的时候为止 * 3.再遍历右边

求一个数组中和最小的连续子数组

#include<stdio.h> #define MAX_LENGTH 10 int main() { int a[MAX_LENGTH]={1,2,3,-2,4,-6,-8,5,3,1}; int i,j,beg,end,tmp,min=0x7fffffff; //beg和end分别为子数组中首末元素下标,min为无穷大的数 beg=end=tmp=0; for(i=0;i<MAX_LENGTH;++i) { tmp=a[i]; for(j=i+1;j<MAX_LENGTH;+