题目来源:中山纪念中学

题目描述:

佳肴就是非常美味的菜的意思,佳肴最关键的是选择好原料。

现在有N种原料,每种原料都有酸度S和苦度B两个属性,当选择多种原料时,总酸度为每种原料的酸度之积,总苦度为每种原料的苦度之和。

正如大家所知,佳肴是既不酸也不苦的,因为要保证所选的原料使得总酸度和总苦度差的绝对值最小。

由于佳肴不能只有水,所以必须至少选择一种佳肴。

输入:

输入第一行包含一个整数N(1<=N<=10),表示原料的种数。
接下来N行每行包含两个用一个空格隔开的整数,分别表示酸度和苦度。
输入数据保证如果所有原料都选上,总酸度和总苦度不会超过10^9。

输出:

输出总酸度和总苦度最小的差。

输入样例:

输入1:
1
3 10

输入2:
2
3 8
5 8

输入3:
4
1 7
2 6
3 8
4 9

输出样例:

输出1:
7

输出2:
1

输出3:
1

样例解释:

样例3中选择最后三种原料,这样总酸度为2×3×4=24,总苦度为6+8+9=23,差为1。

思路:

n<=10是认真的吗?好玩 萌生了邪恶 的想法

以下代码请大佬们选择性食用☟

AC代码1:

#include<bits/stdc++.h>
using namespace std;
int n;
struct kind{
    long long sour;
    long long bit;
}a[11];
int main()
{
    cin>>n;
    for (int i=1;i<=n;i++) cin>>a[i].sour>>a[i].bit;
    if (n==1) {cout<<abs(a[1].sour-a[1].bit)<<endl; return 0;}
    if (n==2) {cout<<min(min(abs(a[1].sour-a[1].bit),abs(a[2].sour-a[2].bit)),abs(a[1].sour*a[2].sour-(a[1].bit+a[2].bit))); return 0;}
    if (n==3)
    {
        long long a1=abs(a[1].sour-a[1].bit);
        long long a2=min(min(abs(a[1].sour-a[1].bit),abs(a[2].sour-a[2].bit)),abs(a[1].sour*a[2].sour-(a[1].bit+a[2].bit)));
        long long a3=99999999999;
        for (int i=1;i<=n;i++)
          for (int j=i+1;j<=n;j++)
            for (int k=j+1;k<=n;k++)
            {
                long long s=a[i].sour*a[j].sour*a[k].sour;
                long long b=a[i].bit+a[j].bit+a[k].bit;
                a3=min(a3,abs(s-b));
            }
        cout<<min(min(a1,a2),a3)<<endl;
        return 0;
    } 
    if (n==4)
    {
        long long a1=99999999999,a2=99999999999,a3=99999999999,a4=99999999999;
        for (int i=1;i<=n;i++)
        {
            a1=min(a1,abs(a[i].sour-a[i].bit));
          for (int j=i+1;j<=n;j++)
          {
            a2=min(a2,abs(a[i].sour*a[j].sour-(a[i].bit+a[j].bit)));
            for (int k=j+1;k<=n;k++)
            {
                long long s=a[i].sour*a[j].sour*a[k].sour;
                long long b=a[i].bit+a[j].bit+a[k].bit;
                a3=min(a3,abs(s-b));
             for (int p=k+1;p<=n;p++)
            {
                long long s=a[i].sour*a[j].sour*a[k].sour*a[p].sour;
                long long b=a[i].bit+a[j].bit+a[k].bit+a[p].bit;
                a4=min(a4,abs(s-b));
            }
            }
          }
          }
        cout<<min(min(min(a1,a2),a3),a4);
        return 0;
    }
    if (n==5)
    {
        long long a1=99999999999,a2=99999999999,a3=99999999999,a4=99999999999,a5=99999999999;
        for (int i=1;i<=n;i++)
        {
            a1=min(a1,abs(a[i].sour-a[i].bit));
          for (int j=i+1;j<=n;j++)
          {
            a2=min(a2,abs(a[i].sour*a[j].sour-(a[i].bit+a[j].bit)));
            for (int k=j+1;k<=n;k++)
            {
                long long s3=a[i].sour*a[j].sour*a[k].sour;
                long long b3=a[i].bit+a[j].bit+a[k].bit;
                a3=min(a3,abs(s3-b3));
            for (int p=k+1;p<=n;p++)
            {
                long long s4=a[i].sour*a[j].sour*a[k].sour*a[p].sour;
                long long b4=a[i].bit+a[j].bit+a[k].bit+a[p].bit;
                a4=min(a4,abs(s4-b4));
            for (int x=p+1;x<=n;x++)
            {
                long long s5=a[i].sour*a[j].sour*a[k].sour*a[p].sour*a[x].sour;
                long long b5=a[i].bit+a[j].bit+a[k].bit+a[p].bit+a[x].bit;
                a5=min(a5,abs(s5-b5));
            }
            }
            }
            }
        }
        cout<<min(min(min(min(a1,a2),a3),a4),a5);
        return 0;
    }
    if (n==6)
    {
        long long a6=99999999999,a1=99999999999,a2=99999999999,a3=99999999999,a4=99999999999,a5=99999999999;
        for (int i=1;i<=n;i++)
        {
            a1=min(a1,abs(a[i].sour-a[i].bit));
          for (int j=i+1;j<=n;j++)
          {
            a2=min(a2,abs(a[i].sour*a[j].sour-(a[i].bit+a[j].bit)));
            for (int k=j+1;k<=n;k++)
            {
                long long s3=a[i].sour*a[j].sour*a[k].sour;
                long long b3=a[i].bit+a[j].bit+a[k].bit;
                a3=min(a3,abs(s3-b3));
            for (int p=k+1;p<=n;p++)
            {
                long long s4=a[i].sour*a[j].sour*a[k].sour*a[p].sour;
                long long b4=a[i].bit+a[j].bit+a[k].bit+a[p].bit;
                a4=min(a4,abs(s4-b4));
            for (int x=p+1;x<=n;x++)
            {
                long long s5=a[i].sour*a[j].sour*a[k].sour*a[p].sour*a[x].sour;
                long long b5=a[i].bit+a[j].bit+a[k].bit+a[p].bit+a[x].bit;
                a5=min(a5,abs(s5-b5));
            for (int y=x+1;y<=n;y++)
            {
                long long s6=a[i].sour*a[j].sour*a[k].sour*a[p].sour*a[x].sour;
                long long b6=a[i].bit+a[j].bit+a[k].bit+a[p].bit+a[x].bit;
                a6=min(a6,abs(s6-b6));
            }
            }
            }
            }
        }
        }
        cout<<min(min(min(min(min(a1,a2),a3),a4),a5),a6);
        return 0;
    }
    if (n==7)
    {
        long long a7=99999999999,a6=99999999999,a1=99999999999,a2=99999999999,a3=99999999999,a4=99999999999,a5=99999999999;
        for (int i=1;i<=n;i++)
        {
            a1=min(a1,abs(a[i].sour-a[i].bit));
          for (int j=i+1;j<=n;j++)
          {
            a2=min(a2,abs(a[i].sour*a[j].sour-(a[i].bit+a[j].bit)));
            for (int k=j+1;k<=n;k++)
            {
                long long s3=a[i].sour*a[j].sour*a[k].sour;
                long long b3=a[i].bit+a[j].bit+a[k].bit;
                a3=min(a3,abs(s3-b3));
            for (int p=k+1;p<=n;p++)
            {
                long long s4=a[i].sour*a[j].sour*a[k].sour*a[p].sour;
                long long b4=a[i].bit+a[j].bit+a[k].bit+a[p].bit;
                a4=min(a4,abs(s4-b4));
            for (int x=p+1;x<=n;x++)
            {
                long long s5=a[i].sour*a[j].sour*a[k].sour*a[p].sour*a[x].sour;
                long long b5=a[i].bit+a[j].bit+a[k].bit+a[p].bit+a[x].bit;
                a5=min(a5,abs(s5-b5));
            for (int y=x+1;y<=n;y++)
            {
                long long s6=a[i].sour*a[j].sour*a[k].sour*a[p].sour*a[x].sour*a[y].sour;
                long long b6=a[i].bit+a[j].bit+a[k].bit+a[p].bit+a[x].bit+a[y].bit;
                a6=min(a6,abs(s6-b6));
            for (int z=y+1;z<=n;z++)
            {
                long long s7=a[i].sour*a[j].sour*a[k].sour*a[p].sour*a[x].sour*a[y].sour;
                long long b7=a[i].bit+a[j].bit+a[k].bit+a[p].bit+a[x].bit+a[y].bit;
                a7=min(a7,abs(s7-b7));  
            }
            }
            }
            }
            }
        }
        }
        cout<<min(min(min(min(min(min(a1,a2),a3),a4),a5),a6),a7);
        return 0;
    }
    if (n==8)
    {
        long long a8=99999999999,a7=99999999999,a6=99999999999,a1=99999999999,a2=99999999999,a3=99999999999,a4=99999999999,a5=99999999999;
        for (int i=1;i<=n;i++)
        {
            a1=min(a1,abs(a[i].sour-a[i].bit));
          for (int j=i+1;j<=n;j++)
          {
            a2=min(a2,abs(a[i].sour*a[j].sour-(a[i].bit+a[j].bit)));
            for (int k=j+1;k<=n;k++)
            {
                long long s3=a[i].sour*a[j].sour*a[k].sour;
                long long b3=a[i].bit+a[j].bit+a[k].bit;
                a3=min(a3,abs(s3-b3));
            for (int p=k+1;p<=n;p++)
            {
                long long s4=a[i].sour*a[j].sour*a[k].sour*a[p].sour;
                long long b4=a[i].bit+a[j].bit+a[k].bit+a[p].bit;
                a4=min(a4,abs(s4-b4));
            for (int x=p+1;x<=n;x++)
            {
                long long s5=a[i].sour*a[j].sour*a[k].sour*a[p].sour*a[x].sour;
                long long b5=a[i].bit+a[j].bit+a[k].bit+a[p].bit+a[x].bit;
                a5=min(a5,abs(s5-b5));
            for (int y=x+1;y<=n;y++)
            {
                long long s6=a[i].sour*a[j].sour*a[k].sour*a[p].sour*a[x].sour*a[y].sour;
                long long b6=a[i].bit+a[j].bit+a[k].bit+a[p].bit+a[x].bit+a[y].bit;
                a6=min(a6,abs(s6-b6));
            for (int z=y+1;z<=n;z++)
            {
                long long s7=a[i].sour*a[j].sour*a[k].sour*a[p].sour*a[x].sour*a[y].sour;
                long long b7=a[i].bit+a[j].bit+a[k].bit+a[p].bit+a[x].bit+a[y].bit;
                a7=min(a7,abs(s7-b7));  
            for (int d=z+1;d<=n;d++)
            {
                long long s8=a[i].sour*a[j].sour*a[k].sour*a[p].sour*a[x].sour*a[y].sour*a[d].sour;
                long long b8=a[i].bit+a[j].bit+a[k].bit+a[p].bit+a[x].bit+a[y].bit+a[d].bit;
                a8=min(a8,abs(s8-b8));
            }
            }
            }
            }
            }
            }
        }
        }
        cout<<min(min(min(min(min(min(min(a1,a2),a3),a4),a5),a6),a7),a8);
        return 0;
    }
    if (n==9)
    {
        long long a9=99999999999,a8=99999999999,a7=99999999999,a6=99999999999,a1=99999999999,a2=99999999999,a3=99999999999,a4=99999999999,a5=99999999999;
        for (int i=1;i<=n;i++)
        {
            a1=min(a1,abs(a[i].sour-a[i].bit));
          for (int j=i+1;j<=n;j++)
          {
            a2=min(a2,abs(a[i].sour*a[j].sour-(a[i].bit+a[j].bit)));
            for (int k=j+1;k<=n;k++)
            {
                long long s3=a[i].sour*a[j].sour*a[k].sour;
                long long b3=a[i].bit+a[j].bit+a[k].bit;
                a3=min(a3,abs(s3-b3));
            for (int p=k+1;p<=n;p++)
            {
                long long s4=a[i].sour*a[j].sour*a[k].sour*a[p].sour;
                long long b4=a[i].bit+a[j].bit+a[k].bit+a[p].bit;
                a4=min(a4,abs(s4-b4));
            for (int x=p+1;x<=n;x++)
            {
                long long s5=a[i].sour*a[j].sour*a[k].sour*a[p].sour*a[x].sour;
                long long b5=a[i].bit+a[j].bit+a[k].bit+a[p].bit+a[x].bit;
                a5=min(a5,abs(s5-b5));
            for (int y=x+1;y<=n;y++)
            {
                long long s6=a[i].sour*a[j].sour*a[k].sour*a[p].sour*a[x].sour*a[y].sour;
                long long b6=a[i].bit+a[j].bit+a[k].bit+a[p].bit+a[x].bit+a[y].bit;
                a6=min(a6,abs(s6-b6));
            for (int z=y+1;z<=n;z++)
            {
                long long s7=a[i].sour*a[j].sour*a[k].sour*a[p].sour*a[x].sour*a[y].sour;
                long long b7=a[i].bit+a[j].bit+a[k].bit+a[p].bit+a[x].bit+a[y].bit;
                a7=min(a7,abs(s7-b7));  
            for (int d=z+1;d<=n;d++)
            {
                long long s8=a[i].sour*a[j].sour*a[k].sour*a[p].sour*a[x].sour*a[y].sour*a[d].sour;
                long long b8=a[i].bit+a[j].bit+a[k].bit+a[p].bit+a[x].bit+a[y].bit+a[d].bit;
                a8=min(a8,abs(s8-b8));
            for (int e=d+1;e<=n;e++)
            {
                long long s9=a[i].sour*a[j].sour*a[k].sour*a[p].sour*a[x].sour*a[y].sour*a[d].sour*a[e].sour;
                long long b9=a[i].bit+a[j].bit+a[k].bit+a[p].bit+a[x].bit+a[y].bit+a[d].bit+a[e].bit;
                a9=min(a9,abs(s9-b9));
            }
            }
            }
            }
            }
            }
            }
        }
        }
        cout<<min(min(min(min(min(min(min(min(a1,a2),a3),a4),a5),a6),a7),a8),a9);
        return 0;
    }
    if (n==10)
    {
        long long a10=99999999999,a9=99999999999,a8=99999999999,a7=99999999999,a6=99999999999,a1=99999999999,a2=99999999999,a3=99999999999,a4=99999999999,a5=99999999999;
        for (int i=1;i<=n;i++)
        {
            a1=min(a1,abs(a[i].sour-a[i].bit));
          for (int j=i+1;j<=n;j++)
          {
            a2=min(a2,abs(a[i].sour*a[j].sour-(a[i].bit+a[j].bit)));
            for (int k=j+1;k<=n;k++)
            {
                long long s3=a[i].sour*a[j].sour*a[k].sour;
                long long b3=a[i].bit+a[j].bit+a[k].bit;
                a3=min(a3,abs(s3-b3));
            for (int p=k+1;p<=n;p++)
            {
                long long s4=a[i].sour*a[j].sour*a[k].sour*a[p].sour;
                long long b4=a[i].bit+a[j].bit+a[k].bit+a[p].bit;
                a4=min(a4,abs(s4-b4));
            for (int x=p+1;x<=n;x++)
            {
                long long s5=a[i].sour*a[j].sour*a[k].sour*a[p].sour*a[x].sour;
                long long b5=a[i].bit+a[j].bit+a[k].bit+a[p].bit+a[x].bit;
                a5=min(a5,abs(s5-b5));
            for (int y=x+1;y<=n;y++)
            {
                long long s6=a[i].sour*a[j].sour*a[k].sour*a[p].sour*a[x].sour*a[y].sour;
                long long b6=a[i].bit+a[j].bit+a[k].bit+a[p].bit+a[x].bit+a[y].bit;
                a6=min(a6,abs(s6-b6));
            for (int z=y+1;z<=n;z++)
            {
                long long s7=a[i].sour*a[j].sour*a[k].sour*a[p].sour*a[x].sour*a[y].sour;
                long long b7=a[i].bit+a[j].bit+a[k].bit+a[p].bit+a[x].bit+a[y].bit;
                a7=min(a7,abs(s7-b7));  
            for (int d=z+1;d<=n;d++)
            {
                long long s8=a[i].sour*a[j].sour*a[k].sour*a[p].sour*a[x].sour*a[y].sour*a[d].sour;
                long long b8=a[i].bit+a[j].bit+a[k].bit+a[p].bit+a[x].bit+a[y].bit+a[d].bit;
                a8=min(a8,abs(s8-b8));
            for (int e=d+1;e<=n;e++)
            {
                long long s9=a[i].sour*a[j].sour*a[k].sour*a[p].sour*a[x].sour*a[y].sour*a[d].sour*a[e].sour;
                long long b9=a[i].bit+a[j].bit+a[k].bit+a[p].bit+a[x].bit+a[y].bit+a[d].bit+a[e].bit;
                a9=min(a9,abs(s9-b9));
            for (int f=e+1;f<=n;f++)
            {
                long long s10=a[i].sour*a[j].sour*a[k].sour*a[p].sour*a[x].sour*a[y].sour*a[d].sour*a[e].sour*a[f].sour;
                long long b10=a[i].bit+a[j].bit+a[k].bit+a[p].bit+a[x].bit+a[y].bit+a[d].bit+a[e].bit+a[f].bit;
                a10=min(a10,abs(s10-b10));
            }
            }
            }
            }
            }
            }
            }
            }
        }
        }
        cout<<min(min(min(min(min(min(min(min(min(a1,a2),a3),a4),a5),a6),a7),a8),a9),a10);
        return 0;
    }
}

回归正题

既然数据这么小,直接搜索就行,不用剪枝也可以过

AC代码2:

#include<bits/stdc++.h>
using namespace std;
int n,anss=999999999;
struct kind{
    int sour;//酸度 
    int bit;//苦度 
}a[100];
void dg(int x,int s,int b,int k) //x代表菜肴种类,s代表酸度,b代表苦度,k代表这个菜肴选不选 
{
    if (x>n)   //递归到底了 
    {
        if(!k) return; //这个菜肴不选的话直接return 
        anss=min(anss,abs(s-b)); //答案要选取最小的度差 
        return;
    }
    dg(x+1,s,b,k);  //不选,直接下一个菜肴 
    dg(x+1,s*a[x].sour,b+a[x].bit,1); //选,酸度和苦度更新 
}
int main()
{
    cin>>n;
    for (int i=1;i<=n;i++) cin>>a[i].sour>>a[i].bit;
    dg(1,1,0,0);
    cout<<anss<<endl;
    return 0;
}