洛谷P2036 [COCI2008-2009#2] PERKET题解

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

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

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

输入格式
第一行包括整数 NN,表示可支配的配料数。

接下来 NN 行,每一行为用空格隔开的两个整数,表示每一种配料的酸度和甜度。

输入数据保证,如果我们添加所有配料,总的酸度和甜度都不会超过 10^9.

输出格式
输出酸度和甜度的最小的绝对差。

输入输出样例
输入
1
3 10
输出
7
输入
4
1 7
2 6
3 8
4 9
输出
1
说明/提示
1<=N<=10

#include
using namespace std;

int n,s = 1, b = 0;//s代表酸度,一定要以1初始!b表示甜度,以0初始。

//用结构体来表示每种配料的属性
struct A{
    int s = 1, b = 0;
}num[11];//创立结构体数组

int sum = 0x3f3f3f3f;//表示最酸度甜度最小差值。

//深搜!!
void dfs(int a,int s,int b){
	//先写结束时的部分,当所有的配料都已经被决定好是否要加进去的时候执行
    if(a > n - 1){
    	//当所有的配料都没有被加进去时的情况,一定仔细看题,要求至少一种配料加进去
        if(s == 1&& b == 0){
            return;
        }
        //不是只有一种配料加进去的时候选出sum和现在差值中较小的那个作为新sum
        sum = min(sum ,abs(s-b));
        return;
    }
    //配料加进去时的搜索
    dfs(a+1,s*num[a].s,b+num[a].b);
    
    //配料不加进去的搜索
    dfs(a+1,s,b);
}

//简单的主函数
int main()
{
    cin>>n;
    for(int i = 0; i < n+1; i ++){
        cin>>num[i].s>>num[i].b;
    }
    
    //从下标为0开始搜索。
    dfs(0,1,0);
    cout<<sum;
    return 0;
}

谢谢观看,希望各位大佬能多指点,初学者渴望得到指导!

你可能感兴趣的:(洛谷P2036 [COCI2008-2009#2] PERKET题解)