枚举法优化//枚举法思想//csjhl和潮汕煎蚝烙

csjhl为什么叫csjhl呢?因为他很喜欢吃潮汕煎蚝烙。可是黄小悦同学一直喜欢和csjhl抢着吃,于是他们决定用24点决一死战。可是他们都很饿,所以一致同意玩简单版的24点。一共有5张牌,牌上数字的范围是1到10,牌的顺序不可以改变,并且只能使用加法和减法。在24点上csjhl单挑无敌,在他看到牌的时候他已经在思考用哪一种方法赢了黄小悦同学。可是csjhl不会数数,所以请你来编写一个程序告诉他一共有多少种方法取得胜利。
!注意:请使用scanf输入,用cin输入请关闭同步,否则容易超时
输入
输入一个T,表示样例组数。
接下来T行,每行5个整数ai。
输出
输出csjhl可以取胜的方案数。
HINT (对于下面的样例)
第二组有一种方案 1-1+7+7+10=24
第三组有两种方案 7+7-1+1+10=24 7+7+1-1+10=24
样例输入
3
1 1 5 5 10
1 1 7 7 10
7 7 1 1 10
样例输出
0
1
2

解题思路:
题目那么长其实关键就是随机给你五个一位数,问你这五个数通过加减组成24的方案有几种。
问方案有几种可能你就会想到用枚举法,可是五选一个来做负数五选二枚举很简单,五选三等就多了。
其实聪明的高手会枚举情况先做个大致的判断。
a.做负数的不可能超过两个
b.可以先把五个数相加如果刚好等于24说明坑定只有一种情况,小于24则坑定一种没有,大于24才要用到枚举法。对没错是坑定。

代码实现:

#include<stdio.h>
int panduan(int arr[],int sum);
int main()
{
    int t,arr[5],sum;
    scanf("%d",&t);
    while(t--)
    /*循环次数t的快速打法*/
    {
        sum=0;
        for(int i=0;i<5;i++)
        {
            scanf("%d",&arr[i]);
            sum+=arr[i];
        }
        if(sum>24)
        printf("%d\n",panduan(arr,sum));
        else if(sum==24)
        printf("1\n");
        else
        printf("0\n");
    }
    return 0;
}
int panduan(int arr[],int sum)
{
    int mark=0;
    for(int i=1;i<5;i++)
    /*注意第一个数不能做负数*/
    {
        if(sum-arr[i]*2==24)
        mark++;
    }   

/*多选二的经典数学枚举算法*/
    for(int i=1;i<5;i++)
    {
        for(int j=i+1;j<5;j++)
        {
            if(sum-arr[i]*2-arr[j]*2==24)
            {
                mark++;
            }
        }
    }

    return mark; 
}

猜你喜欢

转载自blog.csdn.net/qq_40618238/article/details/78905791
今日推荐