洛谷2036深搜题目

题目描述:2036

Perket 是一种流行的美食。为了做好 Perket,厨师们必须小心选择配料,以便达到更好的口感。你有N种可支配的配料。对于每一种配料,我们知道它们各自的酸度 SSS 和甜度 BBB。当我们添加配料时,总的酸度为每一种配料的酸度总乘积;总的甜度为每一种配料的甜度的总和。

众所周知,美食应该口感适中;所以我们希望选取配料,以使得酸度和甜度的绝对差最小。

另外,我们必须添加至少一种配料,因为没有美食是以白水为主要配料的。

思路:

一般要求某某最小,现设初始化ans为无穷大,即ans=0x3f3f3f3f,通过不断比较,找出最小值;题目概述就是去找abs(酸度-甜度)最小,用深搜思想:从编号为1的配料开始,按照酸度相乘,甜度相加,走两条路去深搜,一种是新加的一层的差的绝对值比上一层还小,则执行xs[i],y+b[i],k+1进入下一层,DFS(k+1,xs[i],y+b[i]);如果新加的一层比上一层差的绝对值还大,则本层不执行操作,直接搜索下一层DFS(k+1,x,y);最后边界条件,k>n,

找出最小差值;

代码: #include
using namespace std; int s[11],b[11],n; int ans=0x7fffffff;

void
DFS(int k,int x,int y)  //k为配料的编号,x,y 分别为酸度和甜度

{

//边界条件

if(k>n)

{

if(x1&&y0) return ;

else

ans=min(abs(x-y),ans);

return ;

}

DFS(k+1,x*s[k],y+b[k]);  //有遇到下一层的差值比上一层还大,则舍去,不添加;

DFS(k+1,x,y);       //

}

int main()

{

cin>>n;

for(int i=1;i<=n;i++)

scanf("%d%d",&s[i],&b[i]);

DFS(1,1,0);   //枚举状态空间;

printf("%d\n",ans);

return 0;

}

你可能感兴趣的:(洛谷2036深搜题目)