題目描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Perket 是一种流行的美食。为了做好 Perket,厨师必须谨慎选择食材,以在保持传统风味的同时尽可能获得最全面的味道。你有 n 种可支配的配料。对于每一种配料,我们知道它们各自的酸度 s 和苦度 b。当我们添加配料时,总的酸度为每一种配料的酸度总乘积;总的苦度为每一种配料的苦度的总和。

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

另外,我们必须添加至少一种配料,因为没有任何食物以水为配料的。

输入格式
第一行一个整数 n,表示可供选用的食材种类数。

接下来 n 行,每行 2个整数si和bi ,表示第 i 种食材的酸度和苦度。

输出格式
一行一个整数,表示可能的总酸度和总苦度的最小绝对差。

对于100% 的数据,有1≤n≤10,且将所有可用食材全部使用产生的总酸度和总苦度小于1×10^9
,酸度和苦度不同时为 1 和 0。

題解

点击查看
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>

using namespace std;

const int N = 15;

int a[N];//酸度
int b[N];//苦度
int n;
int ans = 0x3f3f3f3f;

void dfs(int i, int x, int y){
if(i == n){
if(x == 1 && y == 0) return;//至少添加一种,如果没添加就排除
ans = min(ans, abs(x - y));
return;
}
dfs(i + 1, x * a[i], y + b[i]);//添加
dfs(i + 1, x, y);//不添加
}

int main(){
ios::sync_with_stdio(false);
cin.tie(0);

cin >> n;

for(int i = 0; i < n; ++i){
cin >> a[i] >> b[i];
}

dfs(0, 1, 0);//注意第一次 dfs的初始值

cout << ans << endl;

return 0;
}