输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来
输入描述:
每个测试输入包含2个整数,n和m
输出描述:
按每个组合的字典序排列输出,每行输出一种组合
示例1
输入
5 5
输出
1 4 2 3 5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#include<iostream>
#include<vector>
using
namespace
std;
void
help(
int
n,
int
m, vector<
int
>& v,
int
beg) {
//if (beg>n) return;
if
(m == 0) {
for
(
int
i = 0; i<v.size(); i++) {
i == 0 ? cout << v[i] : cout <<
" "
<< v[i];
}
cout << endl;
}
for
(
int
i = beg; i <= n&&i <= m; i++) {
v.push_back(i);
help(n, m - i, v, i + 1);
v.pop_back();
}
}
int
main() {
int
n, m;
while
(cin >> n >> m) {
vector<
int
>v;
help(n, m, v, 1);
}
}
|
#include<stdio.h>
#include<vector>
using
namespace
std;
vector<
int
> d;
void
dfs(
int
,
int
);
int
N,M;
int
main(){
while
(
scanf
(
"%d%d"
,&N,&M)!=EOF)
dfs(1,0);
}
void
dfs(
int
index,
int
sum){
if
(sum>M)
return
;
if
(sum==M){
int
i;
for
(i=0;i<d.size()-1;i++)
printf
(
"%d "
,d[i]);
printf
(
"%d\n"
,d[i]);
}
for
(
int
i=index;i<=N;i++){
d.push_back(i);
dfs(i+1,sum+i);
d.pop_back();
}
}
----------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------