前言:
今天朋友们对“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算法例题