博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode - 39. Combination Sum
阅读量:6345 次
发布时间:2019-06-22

本文共 2012 字,大约阅读时间需要 6 分钟。

39. Combination Sum 

 ----------------------------------------------------------------------------

Mean: 

给你一个待选集合s和一个数n,让你找出集合s中相加之和为n的所有组合.(每个数可选多次)

analyse:

作此题需对递归有一定的理解.

Time complexity: O(N)

 

view code

/**
* -----------------------------------------------------------------
* Copyright (c) 2016 crazyacking.All rights reserved.
* -----------------------------------------------------------------
*       Author: crazyacking
*       Date  : 2016-03-05-18.56
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using
namespace
std;
typedef
long
long(
LL);
typedef
unsigned
long
long(
ULL);
const
double
eps(
1e-8);
class
Solution
{
public
:
   
vector
<
vector
<
int
>>
combinationSum(
vector
<
int
>&
candidates
,
int
target)
   
{
       
sort(
candidates
.
begin
(),
candidates
.
end());
       
vector
<
vector
<
int
>>
res;
       
vector
<
int
>
combination;
       
combinationSum(
candidates
,
res
,
combination
,
target
,
0);
       
return
res;
   
}
private
:
   
void
combinationSum(
vector
<
int
>&
candidates
,
vector
<
vector
<
int
>>
&
res
,
vector
<
int
>&
combination
,
int
target
,
int
begin)
   
{
       
if(
!
target)
       
{
           
res
.
push_back(
combination);
           
return;
       
}
       
for(
int
i
=
begin;
target
>=
candidates
[
i
]
&&
i
<
candidates
.
size() ;
++
i)
       
{
           
combination
.
push_back(
candidates
[
i
]);
           
combinationSum(
candidates
,
res
,
combination
,
target
-
candidates
[
i
],
i);
           
combination
.
pop_back();
       
}
   
}
};
int
main()
{
   
freopen(
"H:
\\
Code_Fantasy
\\
in.txt"
,
"r"
,
stdin);
   
int n
,
target;
   
while(
cin
>>n
>>
target)
   
{
       
cout
<<n
<<
" "
<<
target
<<
endl;
       
vector
<
int
>
ve;
       
for(
int
i
=
0;
i
<n;
++
i)
       
{
           
int
tmp;
           
cin
>>
tmp;
           
ve
.
push_back(
tmp);
       
}
       
Solution
solution;
       
vector
<
vector
<
int
>>
ans
=
solution
.
combinationSum(
ve
,
target);
       
for(
auto
p1:
ans)
       
{
           
for(
auto
p2:
p1)
           
{
               
cout
<<
p2
<<
" ";
           
}
           
cout
<<
endl;
       
}
   
}
   
return
0;
}
/*
*/

转载于:https://www.cnblogs.com/crazyacking/p/5245786.html

你可能感兴趣的文章
为什么要优先使用组合而不是继承 .
查看>>
【MySql】权限不足导致的无法连接到数据库以及权限的授予和撤销
查看>>
android实现gif图与文字混排
查看>>
hdu1384Intervals(差分约束)
查看>>
python 字符编码
查看>>
269D Maximum Waterfall
查看>>
C++11 多线程
查看>>
sed-加速你在Linux的文件编辑
查看>>
HttpServer发送数据到kafka
查看>>
phpcms站---去除域名绑定目录中的HTML
查看>>
20155303 2016-2017-2 《Java程序设计》第九周学习总结
查看>>
一次很失败的抄底
查看>>
数据结构C++(10)二叉树——链表实现(linkBinaryTree)
查看>>
利用Condition实现多线程交替执行
查看>>
里氏替换原则(设计模式原则2)
查看>>
lamp一键安装
查看>>
解决“iOS 7 app自动更新,无法在app中向用户展示更新内容”问题
查看>>
OpenCV——Haar-like特征
查看>>
HttpWebResponse发送post请求并接收
查看>>
python 相对路径和绝对路径的区别
查看>>