蓝桥杯——牌型种数(JAVA)

该文章讨论了一个使用Java编写的代码示例,该示例通过递归方法解决了一种组合问题。原始问题涉及到从13种每种有4张的牌中选择13张,复杂度为13^13。通过改用递归来跟踪当前选择的牌型和总数,将每种牌的选择情况限制为0到4,降低了复杂度至5^13。在递归过程中,当总数超过13时会舍弃无效情况,而成功匹配13张牌时增加结果计数。
摘要由CSDN通过智能技术生成

题目:

 

代码: 

public class Main {
    static int result=0;                //储存结果种数
    public static void main(String[] args) {
        select(0,0);
        System.out.println(result);
    }
    public static void select(int x,int y){   //递归
        if (x>13||y>13){
            return;
        }
        if (x==13&&y==13){
            result++;
            return;
        }
        for (int i=0;i<5;i++){       //0,1,2,3,4,共五种情况
            select(x+1,y+i);
        }
    }
}

思路:可以拿十三次每次拿一张牌,但每张牌都要有十三种情况拿到所以复杂度是13^13复杂度过高。所以换一种思路

13种牌每张牌只有四张,所以我们拿十三张牌每种牌的个数可能是0,1,2,3,4张,共五种情况。

所以我们采取递归思想:

select(int x,int y);

x:目前在拿哪张牌(牌型)。

y:总共拿了多少张牌。

这样每张牌从十三种情况变为了五种,复杂度变为了5^13,并且如果在中途y>13那么可以直接舍弃这种情况(比如1取了4张,2取了4张,3取了4张,4取了4张总共已经16张牌舍弃),如果取到了第十三种牌型的牌,而且总数正好是13则种数加1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值