龙空技术网

超级简单的DFS算法问题

C游戏小白 81

前言:

今天朋友们对“dfs算法例题”大约比较珍视,朋友们都需要了解一些“dfs算法例题”的相关资讯。那么小编同时在网摘上网罗了一些有关“dfs算法例题””的相关知识,希望兄弟们能喜欢,朋友们快快来了解一下吧!

题目描述

Perket 是一种流行的美食。为了做好 Perket,厨师们必须小心选择配料,以便达到更好的口感。你有N种可支配的配料。对于每一种配料,我们知道它们各自的酸度 SS 和甜度 BB。当我们添加配料时,总的酸度为每一种配料的酸度总乘积;总的甜度为每一种配料的甜度的总和。

众所周知,美食应该口感适中;所以我们希望选取配料,以使得酸度和甜度的绝对差最小。

另外,我们必须添加至少一种配料,因为没有美食是以白水为主要配料的。

输入格式

第一行包括整数 NN,表示可支配的配料数。

接下来 NN 行,每一行为用空格隔开的两个整数,表示每一种配料的酸度和甜度。

输入数据保证,如果我们添加所有配料,总的酸度和甜度都不会超过 10^9109。

输出格式

输出酸度和甜度的最小的绝对差。

输入输出样例

输入样例1

13 10

输出样例1

7

输入样例2

41 72 63 84 9

输出样例2

1
说明/提示

1≤N≤10。

这个问题是小白第一个套着DFS模板写出来的DFS问题,算一个很简单的dfs问题。题解并不唯一,话不多说,直接上代码块。

首先先看下模板吧。(这是小白从CSDN看到的,内容来源此处

int check(参数){    if(满足条件)        return 1;    return 0;} void dfs(int step){        判断边界        {            相应操作        }        尝试每一种可能        {               满足check条件               标记               继续下一步dfs(step+1)               恢复初始状态(回溯的时候要用到)        }}   

---

#include<bits/stdc++.h>//C++万能头文件using namespace std;int a[10],b[10],f[10]={0};//数组a代表酸度,数组b代表甜度,数组f代表是否检查过int ans=999999;            //此处answer代表酸甜差的绝对值,也是存储的最小值int sour=1,sweet=0;     //代表已经混合的酸甜程度int n;                             //n代表个数void dfs(int step){    if(step>=n)//   判断边界        {        //nothing,发现如果搜索完全部了之后,其实结果已经保存到了ans中,故不需要再做什么。        }    else        {        	for(int i=0;i<n;i++){        		if(f[i]==0){ //满足check条件,如果这个配料没有用过        			sour=a[i]*sour;					sweet+=b[i];					ans=min(ans,abs(sour-sweet));					f[i]=1;                    //标记					dfs(step+1);          //继续下一步dfs(step+1)					f[i]=0;                   //恢复初始状态(回溯的时候要用到)					sour/=a[i];					sweet-=b[i];				}			}         }	}int main (){	cin >> n;	for(int i=0;i<n;i++){		cin >> a[i]>> b[i];	}	dfs(0);	cout <<ans;	return 0; } 

题解就分享到这,有什么更好的想法欢迎评论呀!

标签: #dfs算法例题