洛谷-P2036 [COCI2008-2009#2] PERKET
阿新 • • 發佈:2020-12-08
洛谷-P2036 [COCI2008-2009#2] PERKET
題目描述
Perket 是一種流行的美食。為了做好 Perket,廚師必須謹慎選擇食材,以在保持傳統風味的同時儘可能獲得最全面的味道。你有 \(n\) 種可支配的配料。對於每一種配料,我們知道它們各自的酸度 \(s\) 和苦度 \(b\)。當我們新增配料時,總的酸度為每一種配料的酸度總乘積;總的苦度為每一種配料的苦度的總和。
眾所周知,美食應該做到口感適中,所以我們希望選取配料,以使得酸度和苦度的絕對差最小。
另外,我們必須新增至少一種配料,因為沒有任何食物以水為配料的。
輸入格式
第一行一個整數 \(n\),表示可供選用的食材種類數。
接下來 \(n\) 行,每行 \(2\) 個整數 \(s_i\) 和 \(b_i\),表示第 \(i\) 種食材的酸度和苦度。
輸出格式
一行一個整數,表示可能的總酸度和總苦度的最小絕對差。
輸入輸出樣例
輸入 #1
1
3 10
輸出 #1
7
輸入 #2
2
3 8
5 8
輸出 #2
1
輸入 #3
4
1 7
2 6
3 8
4 9
輸出 #3
1
說明/提示
資料規模與約定
對於 \(100\%\) 的資料,有 \(1 \leq n \leq 10\)
說明
- 本題滿分 \(70\) 分。
- 題目譯自 COCI2008-2009 CONTEST #2 PERKET,譯者 @mnesia。
C++程式碼
#include <iostream> #include <cmath> using namespace std; int n, s[15], b[15], ans=1e9; void dfs(int k, int ss, int bb) { if (k == n) { if (ss == 1 && bb == 0) return ; ans = min(abs(ss - bb), ans); return ; } dfs(k+1, ss*s[k], bb+b[k]); dfs(k+1, ss, bb); } int main() { cin >> n; for (int i=0; i<n; ++i) cin >> s[i] >> b[i]; dfs(0, 1, 0); cout << ans << endl; return 0; }