(每日一练c++)CC111 组合之和

该博客介绍了如何使用深度优先搜索(DFS)解决在给定候选数集中找到所有加起来等于目标数的组合问题。示例中,候选数集为[20,30,60,70],目标数为70,解集包括[70]和[20,20,30]。算法首先对候选数进行排序,然后通过递归遍历组合可能,确保结果的非递减排序和不重复性。

描述

给出一组候选数C和一个目标数T,找出候选数中加起来和等于T的所有组合。

C中的数字在组合中可以被无限次使用

注意:

  • 题目中所有的数字(包括目标数T)都是正整数
  • 你给出的组合中的数字 (a 1, a 2, … , a k) 要按非递减排序 (ie, a 1 ≤ a 2 ≤ … ≤ a k).
  • 结解集中不能包含重复的组合

例如:给定的候选数集是[20,30,60,70],目标数是7

解集是:

[70]
[20, 20, 30]

class Solution {
    vector<int> d;
    vector<vector<int> > z;
public:
    vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
        sort(candidates.begin(),candidates.end());
        dfs(candidates,0,target,0);
        return z;
    }
    void dfs(vector<int> &candidates,int x,int t,int step)
    {
        if(x>t||x<0) return ;
        if(x==t){z.push_back(d);}
        else
        {
            int i;
            for(i=step;i<candidates.size();i++)
            {
                d.push_back(candidates[i]);
                dfs(candidates,x+candidates[i],t,i);
                d.pop_back();
            }
        }
    }
};

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值