1. 程式人生 > 其它 >洛谷 P2036 [COCI2008-2009 #2] PERKET

洛谷 P2036 [COCI2008-2009 #2] PERKET

原題目傳送門


這個題目的意思就是要求總酸度、總苦度差值的最小值。為了求得這個最小值,我們只需要搜尋兩種狀態:新增這種調料不新增這種調料
因此,我們可以在寫搜尋函式式搜兩種狀態,即可達到我們的目的。

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;
}