组合总和问题---一个数字可重复选择多次

leetcode 39. Combination Sum

一、问题描述

    给定一组数(数字没有重复)和一个目标值,找到数字中和为目标值的所有唯一组合。一个数字可以重复选择多次。
  【注意】

  •         所有数字(包括目标)都是正整数。
  •         结果集不能包含重复的组合。
【举例】
例1:输入: candidates = [2,3,6,7], target = 7,
输出解集:
[
  [7],
  [2,2,3]
]
例2:输入: candidates = [2,3,5], target = 8,
输出解集:
[
  [2,2,2,2],
  [2,3,3],
  [3,5]
]

二、问题分析

由于要输出所有解集具体组合而不是解集个数,因此采用dfs的方法,边递归边记录结果

三、算法实现

/*********************************************************
Author:tmw
date:2018-5-14
*********************************************************/
#include 
#include 

/**
    *final_r_perLen :存储每一组最终结果的长度
    **final_r       :存储所有结果的数组
    start           : 当前递归起始位置
**/
#define MAX_SIZE 200
int result[MAX_SIZE] = {0}; /**存储中间结果的数组**/
int j=0;                    /**结果数组下标**/
int count = 0;              /**记录所有可能的组合个数**/
void sum_dfs( int* array, int array_len, int sum, int start, int** final_r, int* final_r_perLen )
{
    /**终止条件**/
    if( sum == 0 )
    {
        int i;
        for( i=0; isum ) return;

        /**将当前元素加入中间结果数组**/
        result[j++] = array[k];
        sum_dfs(array,array_len,sum-array[k],k,final_r,final_r_perLen);

        j--; /**j回退到递归之前的状态**/
    }
}

/**快排**/
#define swap( x,y,t ) (t=x,x=y,y=t)
int fast_sort_one( int* array, int low, int high )
{
    int target = array[low];
    int temp;
    while( low < high )
    {
        if( low=target )
            high--;
        swap(array[low],array[high],temp);
        if( low

四、执行结果

leetcode accept


梦想还是要有的,万一实现了呢~~~~ヾ(◍°∇°◍)ノ゙~~~

你可能感兴趣的:(深度优先搜索)