洛谷 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;
}
posted @ 2021-12-30 18:16  煎饼Li  阅读(44)  评论(0编辑  收藏  举报