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