蓝桥杯 牌型种数
2016-03-15 00:09
369 查看
题目描述如下:
除去大小王的52张纸牌,不分花色,只考虑点数,也不考虑先后顺序,问每个人手上拿到纸牌组合数目?
向算法靠近的思路 : 不分花色就是有13中牌型,每种牌型视作一个元素,元素的值为0,1,2,3,4(你懂的,一个人手上一种牌型重复的次数),重点来了哦,你算算,十三种元素的和一定是等于13的哦,于是我们穷举回溯,再剪枝,就有了下面的代码
除去大小王的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); } }
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析