牌型种数问题模型

小明在X赌城被迫参与牌局,思考不考虑花色和顺序时,13张牌的不同组合数。通过暴力搜索和动态规划方法解决,同时关联到抽签问题的数学模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.小明被劫持到X赌城,被迫与其他3人玩牌。

一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。

这时,小明脑子里突然冒出一个问题:

如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?

 

请填写该整数,不要填写任何多余的内容或说明文字。

暴力做法

#include <iostream>  
using namespace std;  
int main()  
{  
    int sum=0;  
    for(int a=0; a<=4; a++)  
        for(int b=0; b<=4; b++)  
            for(int c=0; c<=4; c++)  
                for(int d=0; d<=4; d++)  
                    for(int e=0; e<=4; e++)  
                        for(int f=0; f<=4; f++)  
                            for(int g=0; g<=4; g++)  
                                for(int h=0; h<=4; h++)  
                                    for(int i=0; i<=4; i++)  
                                        for(int j=0; j<=4; j++)  
                                            for(int k=0; k<=4; k++)  
                                                for(int l=0; l<=4; l++)  
                                                    for(int m=0; m<=4; m++)  
                                                    {  
                                                        if(a+b+c+d+e+f+g+h+i+j+k+l+m==13)  
                                                            sum++;  
                                                    }  
                                                    cout<<sum<<endl;  
    return 0;  
}  

dfs做法 

深度是牌的类型一共13种,每种牌的数量可以是0-4任何一个,总共取出来13张

package shensou;

public class Text {
	static int count = 0;

	public static void main(String[] args) {
		dfs(0, 0);
		System.out.println(count);
	}

	private static void dfs(int t, int s) {
		if (t == 13) {
			if (s == 13)
				count++;
		}
		for (int i = 0; i < 5; i++) {
			dfs(t + 1, i + s);	
		}

	}

}

还有一种动态规划,我不会

2.抽签

一共n个国家,每个国家派出相应的人数,从中抽出5个人

/*抽签 (代码填空)

X星球要派出一个5人组成的观察团前往W星。

其中:

A国最多可以派出4人。

B国最多可以派出2人。

C国最多可以派出2人。

....

那么最终派往W星的观察团会有多少种国别的不同组合呢?

下面的程序解决了这个问题。

数组a[] 中既是每个国家可以派出的最多的名额。

程序执行结果为:

DEFFF

CEFFF

CDFFF

CDEFF

CCFFF

CCEFF

CCDFF

CCDEF

BEFFF

BDFFF

BDEFF

BCFFF

BCEFF

BCDFF

BCDEF

....

(以下省略,总共101行)

*/
public class chouqian {
	public static void f(int[] a, int k, int n, String s) {

        if (k == a.length) {
            if (n == 0) System.out.println(s);
            return;
        }

        String s2 = s;

        for (int i = 0; i <= a[k]; i++) {
        	f(a,k+1,n-i,s2); //填空位置
          
            s2 += (char) (k + 'A');
        }
    }

    public static void main(String[] args) {
        int[] a = {4, 2, 2, 1, 1, 3};
        f(a, 0, 5, "");
    }


}

这两个题都属于一种类型,深度是可选的种类,for循环中累加选出来的数目。

并没有用到标记数组啥的,真正理解才好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值