zoukankan      html  css  js  c++  java
  • 35 组合总和 II(40)

    作者: Turbo时间限制: 1S章节: 递归

    晚于: 2020-07-29 12:00:00后提交分数乘系数50%

    截止日期: 2020-08-05 12:00:00

    问题描述 :

    给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合,输出组合的数量。

    candidates 中的每个数字在每个组合中只能使用一次。

    说明:

    所有数字(包括目标数)都是正整数。

    解集不能包含重复的组合。 

    示例 1:

    输入: candidates = [10,1,2,7,6,1,5], target = 8,

    所求解集为:

    [

      [1, 7],

      [1, 2, 5],

      [2, 6],

      [1, 1, 6]

    ]

    输出:4

    示例 2:

    输入: candidates = [2,5,2,1,2], target = 5,

    所求解集为:

    [

      [1,2,2],

      [5]

    ]

    输出:2

    可使用以下main函数:

    int main()

    {

        int n,data,target;

        vector<int> candidates;

        cin>>n;

        for(int i=0; i<n; i++)

        {

            cin>>data;

            candidates.push_back(data);

        }

        cin>>target;

        vector<vector<int> > res=Solution().combinationSum2(candidates,target);

        cout<<res.size()<<endl;

        return 0;

    }

    输入说明 :

    首先输入candidates数组的长度n,

    然后输入n个整数,以空格分隔。

    最后输入target 。

    1 <= n <= 60

    1 <= candidates[i] <= 100      candidates 中的元素存在重复。

    1 <= target <= 100

    输出说明 :

    输出一个整数

    输入范例 :

    输出范例 :

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    class Solution {
    
    private:
        vector<int> candidates;
        
        
    public:
        void dfs(vector<vector<int>>& res,vector<int> &candidates,vector<int> &temp,int start, int target) {
            if (target == 0) {
                res.push_back(temp);
                return;
            }
    
            for (int i = start; i < candidates.size() && target - candidates[i] >= 0; i++) {
                if (i > start && candidates[i] == candidates[i - 1])//递归的同时进行去重 
                    continue;
                temp.push_back(candidates[i]);
                // 元素不可重复利用,使用下一个即i+1
                dfs(res,candidates,temp,i + 1, target - candidates[i]);
                temp.pop_back();
               /* for(int j=0;j<temp.size();j++)
                    cout<<"temp"<<temp[j]<<" ";
                cout<<" i "<<i<<" target "<<target<<" start "<<start<<endl;*/
            }
        }
    
        vector<vector<int>> combinationSum2(vector<int> &candidates, int target) {
            sort(candidates.begin(), candidates.end());//排序方便剪枝
            vector<vector<int>> res;
            vector<int> temp;
            dfs(res,candidates,temp,0, target);
            return res;
        }
    };
    
    int main()
    {
        int n,data,target;
        vector<int> candidates;
        cin>>n;
        for(int i=0; i<n; i++)
        {
            cin>>data;
            candidates.push_back(data);
        }
        cin>>target;
        vector<vector<int> > res=Solution().combinationSum2(candidates,target);
        cout<<res.size()<<endl;
        return 0;
    }
  • 相关阅读:
    输出菱形
    for语句输出三角形
    阶乘倒数的和
    变量赋值判断奇偶
    928作业
    各种主流数据库的比较(所以说我觉得Oracle这个keng?入的不错?)
    Oracle创建表
    (转载)全球唯一标识GUID
    (转载)Java基础知识总结
    两天以来对plsqldev操作的记忆
  • 原文地址:https://www.cnblogs.com/zmmm/p/13625289.html
Copyright © 2011-2022 走看看