首页 > 其他分享 >【力扣】组合总数(回溯法)

【力扣】组合总数(回溯法)

时间:2024-03-07 16:34:39浏览次数:22  
标签:总数 target int 力扣 vector candidates 回溯 path size

题目描述

image

#include<iostream>
#include<vector> 
using namespace std;

vector<vector<int> > res;
vector<int> path;

int accumulate(vector<int> path){
	int sum;
	for(int i = 0; i < path.size(); i++){
		sum += path[i];
	}
	return sum;
}
void backtrace(vector<int>& candidates, int target, int startindex){
	//if(accumulate(path.begin(), path.end(),0) == target){
	if(accumulate(path) == target){
		res.push_back(path);
		return ;
	}else if(path.size() == candidates.size()){
		return ;
	}
	
	for(int i = startindex; i < candidates.size(); i++){
		path.push_back(candidates[i]);
		backtrace(candidates, target, i);
		path.pop_back();
	}
}//void 
vector<vector<int> > combinationSum(vector<int>& candidates, int target) {
    res.clear();
	path.clear();
	backtrace(candidates, target, 0);
	return res; 
}
int main(){
	vector<int> candidates;
	int n,m;
	cin>>n;
	while(n--){
		cin>>m;
		candidates.push_back(m);
	}
	int target;
	cin>>target;
	vector<vector<int> > result = combinationSum(candidates, target);
	for(int i = 0; i < result.size(); i++){
		for(int j = 0; j < result[i].size(); j++){
			cout<<result[i][j]<<" ";
		}
		cout<<endl;
	}
	return 0;
}

事实证明纯套模板还是不太可能的,不同的题之间总会有差别,还是要按照三步骤分析,区分同层枚举和向下递归。

标签:总数,target,int,力扣,vector,candidates,回溯,path,size
From: https://www.cnblogs.com/satsuki26681534/p/18059212

相关文章

  • 【力扣】电话号码的组合(回溯法)
    问题描述classSolution{public:vector<string>res;stringpath;//charA[26]={'a','b','c','d','e','f','g',//'h','i','j','k&......
  • 【力扣】求组合(回溯算法)
    题目描述2.以下是回溯算法的模版classSolution{private:vector<vector<int>>res;vector<int>path;//这个变量名还是设为path更合适voidbacktrace(intn,intk,intstartindex){//递归结束条件,这个是根据问题要求修改的if(path.s......
  • 力扣T26与T27的区别
    T27给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。T26你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一......
  • 【力扣】括号匹配(栈的应用)
    题目描述顾名思义代码如下:#include<iostream>#include<string>#include<stack>usingnamespacestd;boolisValid(strings){ if(s.empty()){ returntrue; } if(s.size()%2!=0){ returnfalse; } inti=0; stack<char>st; while(i<......
  • 力扣781.森林中的兔子
    题目:森林中有未知数量的兔子。提问其中若干只兔子"还有多少只兔子与你(指被提问的兔子)颜色相同?",将答案收集到一个整数数组answers中,其中answers[i]是第i只兔子的回答。给你数组answers,返回森林中兔子的最少数量。实现方法:由于要求兔子最少数量,可以假定答案相同的......
  • 力扣88.合并两个有序数组
    题目:给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1的初始长度为m+n......
  • 力扣80.删除排序数组中的重复项 II
    题目:给你一个有序数组nums,请你删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。实现方法:使用map计数,用快慢指针方法,快指针不断加一,慢指针在计数小于出现次数时加一,再将快指针指向的数赋给慢指针指向的数。funcremoveDuplicates(nums......
  • 力扣118.杨辉三角
    题目:给定一个非负整数numRows,生成「杨辉三角」的前numRows行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。实现方法:从第三行开始,通过循环,依次求取上一行相邻两数的和,添加到结果里。funcgenerate(numRowsint)[][]int{ varr[][]int fori:=0;i<nu......
  • 【力扣】奇偶链表
    题目描述思路我想起了一位故人。。前面那道分隔链表的题,只需要把<x的条件改为位置的奇偶即可完全照搬过来,出题人偷懒了属于是。试着不抄代码重新写一遍:简单写了一下发现这道题不太适合用递归算法求解,因为结点在整个链表中的位置不太好确认,试着用双指针法写一下:classSolut......
  • 【力扣】反转链表II
    题目描述思路老样子,还是先用递归试试。在基本问题中,也就是left==rigth或者left+1==right时,直接将两个元素调换顺序即可。我突然发现代码随想录里好像讲过一个用双指针法反转链表的算法。那道题是把整个链表翻转,代码如下://双指针法classSolution{public:ListN......