输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m,要求将其中所有的可能组合列出来。
import java.util.Scanner;
import java.util.Stack;
public class Main {
static int now;
public static void dfs(Stack<Integer> stack, int begin, int m, int n) {
if (now == m) {
for (int num : stack) {
System.out.printf("%s ",num);
}
System.out.println();
return;
}
if (now > m) {
return;
}
for (int i = begin; i <= n; i++) {
now += i;
stack.push(i);
dfs(stack, i + 1, m, n);
stack.pop();
now -= i;
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()) {
int n = scanner.nextInt();
int m = scanner.nextInt();
Stack<Integer>stack=new Stack<>();
now=0;
dfs(stack,1,m,n);
}
}
} #include<iostream>
#include<vector>
using namespace std;
int target;
int numa;
int now;
void dfs(vector<int>& temp,int begin)
{
if(now==target)
{
for(int num:temp)
{
cout<<num<<' ';
}
cout<<endl;
return ;
}
if(now>target)
{
return;
}
for(int i=begin;i<=numa;i++)
{
now+=i;
temp.push_back(i);
dfs(temp,i+1);
temp.pop_back();
now-=i;
}
}
int main()
{
cin>>numa>>target;
vector<int> ss;
now=0;
dfs(ss,1);
} dfs+回溯的简单应用题