洛谷 P2036 [COCI2008-2009 #2] PERKET
阿新 • • 發佈:2021-12-30
原題目傳送門
這個題目的意思就是要求總酸度、總苦度差值的最小值。為了求得這個最小值,我們只需要搜尋兩種狀態:新增這種調料和不新增這種調料。
因此,我們可以在寫搜尋函式式搜兩種狀態,即可達到我們的目的。
void dfs(int id,int sour,int sweet){ // 這裡的id代表配料的編號,sour表示配料的酸度,sweet代表配料的甜度 if (id>n){ // 如果配料的編號大於我們所給出的配料的數量(即用完了所有的配料) if (sour==1 && sweet==0) return; ans=min(abs(sour-sweet),ans); // 輸出總酸度減去總甜度的差值。如果現在新的答案就更小,那麼我們就更新答案。 return; // 返回 } dfs(id+1,sour*a[id],sweet+b[id]); // 搜尋狀態: 要加下一種調料 dfs(id+1,sour,sweet); // 搜尋狀態: 不加下一種調料 }
上程式碼
#include <bits/stdc++.h> #define size 15 using namespace std; int a[size],b[size],n,ans=0x3f3f3f3f; void dfs(int id,int sour,int sweet){ if (id>n){ if (sour==1 && sweet==0) return; ans=min(abs(sour-sweet),ans); return; } dfs(id+1,sour*a[id],sweet+b[id]); dfs(id+1,sour,sweet); } int main(){ scanf("%d",&n); for (int i=1;i<=n;i++){ scanf("%d%d",&a[i],&b[i]); } dfs(1,1,0); printf("%d\n",ans); system("pause"); return 0; }