组合(dfs)

本文介绍了一个使用C语言实现的从n个数中选取r个数的所有可能组合的递归算法。该算法通过深度优先搜索的方式生成所有组合,并利用标记数组避免重复选择同一个数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从n个数里选r个数组合


#include<stdio.h>
#include<string.h>
int n,r;
int a[11];
int vis[11];

void dfs(int step)
{
	if(step==r+1)
	{
		for(int i=1;i<=r;i++)
			printf("%d",a[i]);
		printf("\n");
		return;
	}
	for(int i=n;i>0;i--)
	{
		if(vis[i]==0 && i<a[step-1])
		{
			vis[i]=1;
			a[step]=i; 
			dfs(step+1);
			vis[i]=0;
		}
	}
 } 
 int main()
 {
	a[0]=1000;
	scanf("%d %d",&n,&r);
	memset(vis,0,sizeof(vis));
	dfs(1);	 
	return 0;
 }

### Java 中 DFS 实现组合问题 在 Java 中,可以利用深度优先搜索 (DFS) 来解决组合问题。以下是关于如何通过 DFS 解决组合问题的具体方法。 #### 1. 组合问题描述 假设我们需要从 n 个不同的数中选出 k 个数组成一组,找出所有的可能组合。这个问题可以通过递归调用和回溯来完成,而 DFS 是实现这一过程的核心思想之一[^1]。 #### 2. DFS 算法核心逻辑 DFS 的基本原理是从某个起点出发,沿着某一条路径尽可能深入探索,直到无法继续前进时再返回上一层并尝试其他路径。对于组合问题来说,每次选择一个数字加入当前组合,并标记该数字已被选中;如果达到目标长度,则保存结果;否则继续向下层递归寻找新的候选者[^4]。 #### 3. Java 示例代码 下面提供了一个基于 DFS 的 Java 方法 `combine` 和辅助函数 `dfsCombine`,用于求解上述提到的组合问题: ```java import java.util.ArrayList; import java.util.List; public class CombinationExample { public List<List<Integer>> combine(int n, int k) { List<List<Integer>> result = new ArrayList<>(); if (k <= 0 || n < k) return result; // 边界情况处理 dfsCombine(result, new ArrayList<>(), 1, n, k); return result; } private void dfsCombine(List<List<Integer>> result, List<Integer> currentCombination, int start, int n, int remainingCount) { if (remainingCount == 0) { // 当剩余数量为零时,表示找到一个有效组合 result.add(new ArrayList<>(currentCombination)); return; } for (int i = start; i <= n && remainingCount >= 0; ++i) { currentCombination.add(i); // 将当前元素加入临时列表 // 进入下一层递归 dfsCombine(result, currentCombination, i + 1, n, remainingCount - 1); // 回溯操作:移除最后一个添加进去的元素以便尝试下一个可能性 currentCombination.remove(currentCombination.size() - 1); } } public static void main(String[] args) { CombinationExample ce = new CombinationExample(); System.out.println(ce.combine(5, 3)); // 输出 [[1, 2, 3], [1, 2, 4], ... , [3, 4, 5]] } } ``` 此程序定义了一个类 `CombinationExample` ,其中包含了两个主要部分: - **combine**: 主入口函数,负责初始化参数以及启动递归流程。 - **dfsCombine**: 私有递归函数,执行具体的深度优先搜索逻辑[^2]。 #### 4. 时间复杂度分析 由于每一步都有两种决策(选取或不选取),因此总的运行时间为 O(C(n,k)),即 C 表示从 n 项里挑选 k 项的不同方式数目。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值