题目描述
Perket 是一种流行的美食。为了做好 Perket,厨师们必须小心选择配料,以便达到更好的口感。你有N种可支配的配料。对于每一种配料,我们知道它们各自的酸度 SS 和甜度 BB。当我们添加配料时,总的酸度为每一种配料的酸度总乘积;总的甜度为每一种配料的甜度的总和。
众所周知,美食应该口感适中;所以我们希望选取配料,以使得酸度和甜度的绝对差最小。
另外,我们必须添加至少一种配料,因为没有美食是以白水为主要配料的。
输入格式
第一行包括整数 NN,表示可支配的配料数。
接下来 NN 行,每一行为用空格隔开的两个整数,表示每一种配料的酸度和甜度。
输入数据保证,如果我们添加所有配料,总的酸度和甜度都不会超过 10^9.
。
输出格式
输出酸度和甜度的最小的绝对差。
输入输出样例
输入
1
3 10
输出
7
输入
4
1 7
2 6
3 8
4 9
输出
1
说明/提示
1<=N<=10
#include
using namespace std;
int n,s = 1, b = 0;//s代表酸度,一定要以1初始!b表示甜度,以0初始。
//用结构体来表示每种配料的属性
struct A{
int s = 1, b = 0;
}num[11];//创立结构体数组
int sum = 0x3f3f3f3f;//表示最酸度甜度最小差值。
//深搜!!
void dfs(int a,int s,int b){
//先写结束时的部分,当所有的配料都已经被决定好是否要加进去的时候执行
if(a > n - 1){
//当所有的配料都没有被加进去时的情况,一定仔细看题,要求至少一种配料加进去
if(s == 1&& b == 0){
return;
}
//不是只有一种配料加进去的时候选出sum和现在差值中较小的那个作为新sum
sum = min(sum ,abs(s-b));
return;
}
//配料加进去时的搜索
dfs(a+1,s*num[a].s,b+num[a].b);
//配料不加进去的搜索
dfs(a+1,s,b);
}
//简单的主函数
int main()
{
cin>>n;
for(int i = 0; i < n+1; i ++){
cin>>num[i].s>>num[i].b;
}
//从下标为0开始搜索。
dfs(0,1,0);
cout<<sum;
return 0;
}
谢谢观看,希望各位大佬能多指点,初学者渴望得到指导!