蓝桥杯第六届C语言---牌型树种

牌型种数

小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?

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

思路分析

对于动态规划的问题,一定要找准对应求的子问题,根据简单容易求出的初始值,来带入计算得到相应的每一步子问题的答案,最终可以得到想要的结果。具体步骤如下:

1、分解成子问题

例本题中,a[13][13]表示在13种牌中取出13张,可以先依次求a[6][5],a[3][4],a[2][2]的解,有简单向后去求。

2、初始值的计算

这里初始值为,a[1][0]=a[1][1]=a[1][2]=a[1][3]=a[1][4]=1;如果只有一种牌的话,不管要取多少张只有一种方法。

3、使用循环的嵌套,注意每一层循环所表示的含义

4、子问题的求解,要利用上一层所得到的解

5、使用二维数组,得到自己想要的答案

这里根据题意可知a[13][13]为要求的答案

#include<stdio.h >
int a[14][14]={0};      //a[i][j]表示在 i种牌中取出 j张一共有多少种取法 

int main(){
	int i,j,k;
	
	a[1][0]=a[1][1]=a[1][2]=a[1][3]=a[1][4]=1;     //动态规划必须算出前几个作为初值 
	for(i=2;i<14;i++){             //i表示共有i种牌 
		for(j=0;j<14;j++){         //j表示一共需要多少张 
		
			//以下实现部分,需要想出办法
			//例如求 a[6][5],即是从 6种牌中取出 5张来,我们可以将这 6种看成前 5种加上第六种 
			//所以可以得出,前五种取出 5张即 a[5][5],第六种取出 0种
			 //所以可以得出,前五种取出 4张即 a[5][4],第六种取出 1种
			 //所以可以得出,前五种取出 3张即 a[5][3],第六种取出 2种
			 //所以可以得出,前五种取出 2张即 a[5][2],第六种取出 3种
			 //所以可以得出,前五种取出 1张即 a[5][1],第六种取出 4种
			 //又因为每一种牌最多只可以取出 4张,所以只有以上 5个相加
			 //特别注意,j小于 4的时候,即取出的牌数小于4张,则新加入的那一种牌取不到4张,相应种类数会减少,不构成5种相加 
			for(k=0;k<5;k++){
				if(j-k>=0){
					a[i][j]=a[i][j]+a[i-1][j-k];
				}
				
			} 
		
		}
	}
	
	printf("%d",a[13][13]);
	
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值