您的位置:首页 > 其它

蓝桥杯 牌型种数

2016-03-15 00:09 369 查看
题目描述如下:

除去大小王的52张纸牌,不分花色,只考虑点数,也不考虑先后顺序,问每个人手上拿到纸牌组合数目?

向算法靠近的思路 : 不分花色就是有13中牌型,每种牌型视作一个元素,元素的值为0,1,2,3,4(你懂的,一个人手上一种牌型重复的次数),重点来了哦,你算算,十三种元素的和一定是等于13的哦,于是我们穷举回溯,再剪枝,就有了下面的代码

package lanqiao;

public class PaperCardPlus {

public static int sum = 0;
public static int count = 0;

public static void calculate(int kind)
{
if(sum>13||kind>13)
return;
if(kind == 13&& sum == 13)
{
count ++;
return;
}

if(kind<13)
{
int i;
for(i=0;i<5;i++)
{
sum += i;
calculate(kind + 1);
sum -= i;    //回溯的时候一定要记住还原标记!!!
}
}

}

public static void main(String[] args){
calculate(0);
System.out.println(count);
}
}
其实还有动态规划的解法,今天打球太困了,我先放上代码

package lanqiao;

public class PaperCard {
/**
* @param args
*/

public static void calculate(int num[][])
{

for(int k = 9; k <= 13;k++)
{
num[1][k]=1;
}
for(int i = 2;i <= 13;i++)
{
for(int j = 0;j <= 13;j++){
for(int pre = j; pre <= j + 4 && pre <= 13;pre++){
num[i][j]+=num[i-1][pre];
}
}
}
System.out.println(num[13][0]);
}

public static void main(String[] args){
int[][] num = new int[14][14];
calculate(num);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法