(回溯法)数组中和为S的N个数

Given a list of numbers, find the number of tuples of size N that add to S.

for example in the list (10,5,-1,3,4,-6), the tuple of size 4 (-1,3,4,-6) adds to 0.

题目:

给一数组,求数组中和为S的N个数

思路:

回溯法,数组中每个数都有两种选择,取或者不取;

当选择的数等于N时,则判断该数之和是否等于S。

代码:

#include <iostream>
#include <vector>

using namespace std;

void GetSum(int sum,vector<int> &result,int *num,int n,int curSum,int index,int count){
    if(count==n+1)
        return;

    if(index==4){
        if(curSum==sum){
            for(int i=0;i<4;i++)
                cout<<result[i]<<" ";
            cout<<endl;
        }
        return;
    }

    int x=num[count];
    result.push_back(x);
    GetSum(sum,result,num,n,curSum+x,index+1,count+1);
    result.pop_back();
    GetSum(sum,result,num,n,curSum,index,count+1);
}

int main()
{
    int nums[]={10,-5,-5,0,5,4,6};
    int len=sizeof(nums)/sizeof(nums[0]);
    int curSum=0;
    int index=0;
    int count=0;
    int sum=0;
    vector<int> result;
    GetSum(sum,result,nums,len,curSum,index,count);
    return 0;
}
时间: 2024-10-07 17:56:46

(回溯法)数组中和为S的N个数的相关文章

《剑指offer》:[41]数组中和为S的两个数

题目:输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的它们的和正好是S.如果有多对数字的和等于S,输出其中的一对即可. 例如输入数组{1,2,4,7,11,15}和数字15.由于4+11=15,因此输出4和11. 方案一:时间复杂度为O(N*N).顺序查找法,固定一个数,然后和剩余的N-1个数做和,看和是否为S:如没有,将固定的数下移一个,再与N-2个数字做和,看是否相等.很明显,其时间复杂度为:O(N*N) . 方案二:时间复杂度为O(N)的查找方法.因为数组是有序的递增的序列,我

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数

题目描述: 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数.   你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用.示例:给定 nums = [2, 7, 11, 15], target = 9返回 [0, 1] 思路: 第一层for循环从索引0到倒数第二个索引拿到每个数组元素,第二个for循环遍历上一层for循环拿到的元素的后面的所有元素. 具体代码: 1 public class Solution { 2 public int[] twoSum(int[] nums,

18. 4Sum -- 找到数组中和为target的4个数

Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target. Note: The solution set must not contain duplicate quadruplets. For exampl

23 二叉树中和为某一值的路径 + 回溯法深入总结

题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 思路:原来的我是将借口定义为tmp传值的形式,这样多次拷贝数组效率不高,所以改成传引用的形式. 到达二叉树叶子节点的时候,值减为0,那么这条路径就是我们需要的结果.如果到了叶子节点不满足要求,那么下次是空节点,直接返回了. 回溯法的理解:因为想整个递归过程只使用一个tmp数组存储所有的符合条件的路径结果,所以需要使用回溯法,在进行下次递归之前,需

求数组中和为给定值的所有子序列

2017年网易游戏的一道编程题,大致意思是满足组合攻击技能,必须是所选择时技能的和为m(m>0),且所选的这些技能的乘积最大: 分解后主解决两个问题: 其一:求数组中和为m的所有子数组: 其二:在满足一的条件下,求所有子数组的最大值: 主要考察的还是如何求数组中和为m的所有子数组: 如:数组[1,2,3,4,5,6],m=7时,满足条件的子数组有[1,2,4],[3,4],[2,5],[1,6]; 主要使用回溯法解决该问题,思路以后补上: import java.util.ArrayList;

五大常用算法之四:回溯法

(转自:http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741376.html) 1.概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径. 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”. 许

回溯法 -数据结构与算法

1.回溯法算法思想: 定义: 回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”. 1.回溯法适用:有许多问题,当需要找出它的解集(全部解)或者要求回答什么解是满足某些约束条件的最优解时,往往要使用回溯法. 2.有组织的穷举式搜索:回溯法的基本做法是搜索或者有的组织穷尽搜索.它能避免搜索所有的可能性.即避免不必要的搜索.这种方

0-1背包-回溯法

算法描述: 0-1背包的回溯法,与装载问题的回溯法十分相似.在搜索解空间树时,只要其左儿子结点是一个可行结点,搜索就进入其左子树.当右子树中有可能包含最优解时才进入右子树进行搜索.否则将右子树剪去. 计算右子树上界的更好算法是: 将剩余物品依其单位重量价值排序,然后依次装入物品,直至装不下时,再装入该物品的一部分而装满背包. 算法实现: 由Bound函数计算当前节点处的上界. 类Knap的数据成员记录解空间树的节点信息,以减少参数传递及递归调用所需的栈空间. 在解空间树的当前扩展结点处,仅当要进

回溯法求迷宫问题

回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”.本文使用回溯法求解迷宫问题迷宫问题,有一个m行n列的矩阵代表迷宫,1代表此路不通,0代表此路通.指定入口和出口,判断是否能从入口进,从出口走出.此程序只判断从路口到出口是否能走通,找到的路不一定是最短路(最短路的程序在下一篇中使用BFS算法给出),注意:从入口到