洛谷P2036 [COCI2008-2009#2] PERKET

题目描述

Perket 是一种流行的美食。为了做好 Perket,厨师必须谨慎选择食材,以在保持传统风味的同时尽可能获得最全面的味道。你有 n 种可支配的配料。对于每一种配料,我们知道它们各自的酸度 s 和苦度 b。当我们添加配料时,总的酸度为每一种配料的酸度总乘积;总的苦度为每一种配料的苦度的总和。

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

另外,我们必须添加至少一种配料,因为没有任何食物以水为配料的。

输入格式

第一行一个整数 n,表示可供选用的食材种类数。

接下来 n 行,每行 22 个整数 si 和 bi,表示第 i 种食材的酸度和苦度。

输出格式

一行一个整数,表示可能的总酸度和总苦度的最小绝对差。

 

dfs深搜即可

 

复制代码
#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;
const int N = 11;
int n;
int suan = 1;
int ku ;
int s[N];
int k[N];
int st[N];
int minx = 0x3f3f3f3f;

void dfs(int u)
{
    if(u > n)
    {
    
    for(int i = 1 ; i <= n ; i++)
    {
        if(st[i] == 1)
        {
            suan *= s[i];
            ku += k[i];
            minx = min(minx,abs(suan - ku));
        }
    }
    
    suan = 1;
    ku = 0;
    
    return ;
    }
    
    st[u] = 2;
    dfs(u+1);
    st[u] = 0;
    
    st[u] = 1;
    dfs(u+1);
    st[u] = 0;
    
}


int main()
{
    cin>>n;
    
    for(int i = 1 ; i <= n ; i++)
    {
        cin>>s[i]>>k[i];
    }
    
    dfs(1);

    cout<<minx;
       
    return 0;
}
复制代码

借用一下大佬的位运算方法

复制代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;
int N,s[12],b[12],mi=2000000001;
int main()
{
    scanf("%d",&N);
    for(int i=0;i<N;i++)
        scanf("%d %d",&s[i],&b[i]);
    for(int i=1;i<(1<<N);i++)
    {
        int S=1,B=0;
        for(int j=0;j<N;j++)
            if((i>>j)&1)
            {
                S*=s[j];
                B+=b[j];
            }
        mi=min(mi,abs(S-B));
    }
    printf("%d",mi);
    return 0;
}
复制代码

 

 

 

posted @   `Galaxy`  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示