DFS题目



输入两个整数 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();
     }
}

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

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


猜你喜欢

转载自blog.csdn.net/qq_40086556/article/details/80277238
dfs