YbtOJ——深度搜索【例题1】拔河比赛

A. 【例题1】拔河比赛

题目

题目链接
在这里插入图片描述

题解

由于本题数据过水,用爆搜即可过掉。
只考虑一个队伍,搜索每个人加不加进这个队伍里,若不加其实就是加进另一个队。
若当前加的人数未达半数,即可加进去;
若当前没加的人数未达半数,即可不加进去

代码

#include<iostream>
#include<cmath>
using namespace std;
int t,n,m,ans,a[100];
void dfs(int dep,int c1,int c2,int sum,int n)//c1记录一队人数,c2记录未加进一队的人数(二队人数),sum记录一队重量
{
	if(dep>n)
	{
		int sum2=m-sum;//另一队重量
		ans=min(ans,abs(sum-sum2));//统计最小差值
	}
	else
	{
		if(c1<(n+1)/2) dfs(dep+1,c1+1,c2,sum+a[dep],n); //当前加的人数未达半数,即可加进去
		if(c2<(n+1)/2) dfs(dep+1,c1,c2+1,sum,n); //当前没加的人数未达半数,即可不加进去
	}
}
int main()
{
	cin>>t;
	for(int i=1; i<=t; i++)
	{
		cin>>n;
		m=0;
		for(int j=1; j<=n; j++)
		{
			cin>>a[j];
			m+=a[j];//统计总重量
		}
		ans=0x7f7f7f7f;//ans统计最小答案,要初始化最大值
		dfs(1,0,0,0,n);
		cout<<ans<<endl;
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
一个经典的深度优先搜索DFS例题是迷宫问题。 假设有一个迷宫,其中包含了一些墙壁和通道。你的任务是找到从起点到终点的路径。在迷宫中,你只能沿上、下、左、右四个方向移动,不能斜向移动,并且不能穿过墙壁。 DFS 是一种递归的搜索算法,在解决迷宫问题时非常有效。它的基本思想是从起点开始,依次尝试每个可能的移动方向,直到找到路径或者无法继续移动为止。如果遇到无法继续移动的情况,就会回溯到上一个位置,尝试其他方向。 下面是一个简单的示例代码,演示了如何使用深度优先搜索解决迷宫问题: ```python def dfs(maze, start, end): rows = len(maze) cols = len(maze[0]) # 创建一个与迷宫大小相同的二维数组来记录访问状态 visited = [[False] * cols for _ in range(rows)] # 定义上、下、左、右四个方向的移动向量 directions = [(0, 1), (0, -1), (1, 0), (-1, 0)] def can_move(row, col): # 判断当前位置是否可以移动 if row < 0 or row >= rows or col < 0 or col >= cols: return False if maze[row][col] == 1 or visited[row][col]: return False return True def dfs_helper(row, col): # 标记当前位置为已访问 visited[row][col] = True # 如果当前位置是终点,返回True表示找到了路径 if (row, col) == end: return True # 尝试四个移动方向 for direction in directions: new_row = row + direction[0] new_col = col + direction[1] if can_move(new_row, new_col): if dfs_helper(new_row, new_col): return True # 如果四个方向都无法找到路径,回溯到上一个位置 return False # 从起点开始进行深度优先搜索 return dfs_helper(start[0], start[1]) ``` 这只是一个简单的演示,实际应用中可能需要更复杂的逻辑来处理不同的情况。希望能帮到你!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值