求助 足彩任选9 注数的算法问题

爱打代码不 2017-04-19 04:54:04
我把他精简了一下:
三个整型数组 a[] b[] c[]
a中的数字从0~13中取 最少9个,
b中的数字来自a,
c中的数字来自b。
从这三个数组中取9个数字,
其中不能出现相同的数字,
但是数字可以来自不同的数组。
举个例子
a[]={0,1,2,3,4,5,6,7,8,9}
b[]={0,1,2}
c[]={0,1}
任选9个可以是
0a,1a,2a,3,4,5,6,7,8;
也可以是
0b,1a,2a,3,4,5,6,7,8;
或者
0b,1c,2a,3,4,5,6,7,8;
这是算3种。
但不能是;
0a,0b,1a,1c,2,3,4,5,6;这种
求一个算法输出这些组合。。。或者计算所有组合的数量
有大佬没有啊



...全文
2742 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
我是Gaod 2017-10-30
  • 打赏
  • 举报
回复
你好,请问你算出来了吗
半把秋风、 2017-06-21
  • 打赏
  • 举报
回复
我是刚开始接触到彩票的,在写老足彩的投注,开始的时候用阶乘组合去写,如果每场比赛只能选一个赔率的话,倒是可以,但是多选跟胆拖之后就乱了,我就写了比较原始的方法(这个可以用递归去简化代码,精简到通用,不过这边开发任务比较重,前期不准备归纳了),我把任九当做为九串一的串关投注去理解,所以写了这种看起来很烦的代码;
private int getSF9Notes(SerializableSparseArray<String> sparseArray, SparseArray<Integer> danArr) {
int matchCount = 0;
int sizeMatch = sparseArray.size();
int sizeDan = danArr.size();
SparseArray<Integer> defaultCount = new SparseArray<>();
if (sizeDan == 0) {
// 没有胆
for (int i = 0; i < sizeMatch; i++) {
defaultCount.put(i, sparseArray.get(sparseArray.keyAt(i)).split("_").length);
}
int realNum = sizeMatch - 9;
switch (realNum) {
case 0:
// 正好选择了9场比赛
matchCount = 1;
for (int i = 0; i < sizeMatch; i++) {
matchCount *= defaultCount.get(i);
}
break;
default:
// 选择了10+场比赛
for (int j = 0; j < realNum + 1; j++) {
int noteA = defaultCount.get(j);
for (int l = j + 1; l < realNum + 2; l++) {
int noteB = defaultCount.get(l);
for (int m = l + 1; m < realNum + 3; m++) {
int noteC = defaultCount.get(m);
for (int n = m + 1; n < realNum + 4; n++) {
int noteD = defaultCount.get(n);
for (int o = n + 1; o < realNum + 5; o++) {
int noteE = defaultCount.get(o);
for (int p = o + 1; p < realNum + 6; p++) {
int noteF = defaultCount.get(p);
for (int q = p + 1; q < realNum + 7; q++) {
int noteG = defaultCount.get(q);
for (int r = q + 1; r < realNum + 8; r++) {
int noteH = defaultCount.get(r);
int noteI = 0;
for (int i = r + 1; i < sizeMatch; i++) {
noteI += defaultCount.get(i);
}
matchCount += noteA * noteB * noteC * noteD * noteE * noteF * noteG * noteH * noteI;
}
}
}
}
}
}
}
}
break;
}
} else// 胆拖投注就不贴代码了,因为没整理,我是从1到八个胆码的情况都分别写了


github_38546709 2017-04-27
  • 打赏
  • 举报
回复
换个号 思路错了,有幸得q群大佬点播,现放上完整代码

public static long getRen9Numbers(boolean[] winChecked,
                                      boolean[] tieChecked,boolean[] lossChecked) throws Exception {
        TreeSet<Integer> first=new TreeSet<>();
        TreeSet<Integer> second=new TreeSet<>();
        TreeSet<Integer> three=new TreeSet<>();
        for(int i=0;i<winChecked.length;i++){
            if(winChecked[i]){
                first.add(i);
            }
        }
        for(int i=0;i<tieChecked.length;i++){
            if(tieChecked[i]){
                if(first.contains(i)){
                    second.add(i);
                }else{
                    first.add(i);
                }
            }
        }
        for(int i=0;i<lossChecked.length;i++){
            if(lossChecked[i]){
                if(first.contains(i)){
                    if(second.contains(i)){
                        three.add(i);
                    }else{
                        second.add(i);
                    }
                }else{
                    first.add(i);
                }
            }
        }
        long num=0;
        if(first.size()<9){
            num = 0;
        }else{
            if(second.size()==0){
                num= combineNum(first.size(),9).intValue();
            }else{
                if(three.size()==0){
                    for(int i=0;i<=second.size();i++){
                      num=num+combineNum(second.size(),i).longValue()*
                              combineNum(first.size()-i,9-i).longValue();
                    }
                }else{
                    for(int i=0;i<=three.size();i++){
                        long count1=0;
                        for(int j=0;j<=second.size()-i;j++){
                            count1=count1+combineNum(second.size()-i,j).longValue()*
                                    combineNum(first.size()-(j+i),9-(j+i)).longValue();
                        }
                        num=num+combineNum(three.size(),i).longValue()*count1;
                    }
                }
            }
        }
        return num;
    }

爱打代码不 2017-04-24
  • 打赏
  • 举报
回复

 /*
   * 任选9场 根据选号结果计算选号注数
   * */
    public static int getRen9Numbers(boolean[] winChecked,boolean[] tieChecked,boolean[] lossChecked)
        throws Exception{
        TreeSet<Integer> first=new TreeSet<>();
        TreeSet<Integer> second=new TreeSet<>();
        TreeSet<Integer> three=new TreeSet<>();
        for(int i=0;i<winChecked.length;i++){
            if(winChecked[i]){
                first.add(i);
            }
        }
        for(int i=0;i<tieChecked.length;i++){
            if(tieChecked[i]){
                if(first.contains(i)){
                    second.add(i);
                }else{
                    first.add(i);
                }
            }
        }
        for(int i=0;i<lossChecked.length;i++){
            if(lossChecked[i]){
                if(first.contains(i)){
                    if(second.contains(i)){
                        three.add(i);
                    }else{
                        second.add(i);
                    }
                }else{
                    first.add(i);
                }
            }
        }
        int num=0;
        if(first.size()<9){
            num = 0;
        }else{
            if(second.size()==0){
                    num= combineNum(first.size(),9).intValue();
            }else{
                if(three.size()==0){
                        num=combineNum(first.size(),9).intValue();
                        for(int i=1;i<=second.size();i++){
                            num=num+combineNum(first.size()-i,9-i).intValue()
                                    *combineNum(second.size(),second.size()-i).intValue();
                        }
                }else{
                    if(three.size()==second.size()){
                        if(first.size()==9){
                            num=(int)Math.pow(3,three.size());
                        }else{
                            num=combineNum(first.size(),9).intValue();
                            for(int i=1;i<=second.size();i++){
                                if(i==1){
                                    num=num+combineNum(first.size()-i,9-i).intValue()
                                            *combineNum(2*second.size(),i).intValue();
                                }else{
                                    num=num+combineNum(first.size()-i,9-i).intValue()
                                            *(combineNum(2*second.size(),i).intValue()-
                                            second.size()*combineNum(2*second.size()-2*(i-1),i-1).intValue());
                                }
                            }
                        }
                    }else {
                        if(first.size()==9){
                            num= (int)(Math.pow(3,three.size())*Math.pow(2,second.size()-three.size())
                                    *combineNum(first.size(),9).intValue());
                        }else{
                            num=-1;
                        }
                    }
                }
            }
        }
        return num;
    }
在再附上这几天的代码 最后一步还是没搞定
爱打代码不 2017-04-24
  • 打赏
  • 举报
回复

这种 我要的是怎么得到的756,这是根本的问题,上面数组是我简化之后的
爱打代码不 2017-04-24
  • 打赏
  • 举报
回复
引用 12 楼 tianfang 的回复:
9场:任选9场,C(9,14);9场比赛3种结果,排列的个数是3的9次方。总数是C(9,14)*3^9 从14场中选9场比赛有C(9,14)种可能; 上面任意一种场次组合,9场比赛,每场3种结果,比赛结果的可能是3^9 14选9的时候,全部可能的结果排列,就有C(9,14)*3^9的可能 其他类推
所以说你算得和我说的不是一个东西, 你算得是14场选9场的所有可能, 你说的这种情况在玩任选9时只有把所有选项全部选了才能算出来这种注数 而我算的是选择结果可变 选择场数可变的注数 上面已经说的很清楚了啊, 我再举一遍例子 我14场比赛 选了10场, 其中有三场胜负平结果全选 两场只选了胜负, 其他都是选择了单一结果, 注意“每9场为一注”,我大概没仔细说这个? 我算的的是注数, 是以我选的结果为基数算的注数 而不是以14场, 并且所有结果全选的情况下
tianfang 2017-04-24
  • 打赏
  • 举报
回复
9场:任选9场,C(9,14);9场比赛3种结果,排列的个数是3的9次方。总数是C(9,14)*3^9 从14场中选9场比赛有C(9,14)种可能; 上面任意一种场次组合,9场比赛,每场3种结果,比赛结果的可能是3^9 14选9的时候,全部可能的结果排列,就有C(9,14)*3^9的可能 其他类推
tianfang 2017-04-21
  • 打赏
  • 举报
回复
你说的和 足彩任选9 有什么关系?
爱打代码不 2017-04-21
  • 打赏
  • 举报
回复
引用 8 楼 tianfang 的回复:
你说的和 足彩任选9 有什么关系?
http://caipiao.163.com/t/rx9/?isClearCookie=1&topHi=false 老哥 就像网易的这个任选9 我算的是复式啊...
爱打代码不 2017-04-21
  • 打赏
  • 举报
回复
引用 10 楼 tianfang 的回复:
2楼就给你列出了啊 “组合(9,14)” 是14个选9个组合数,这个你会算吧,9个,10个给你列出了 ,后面自己补全了啊
大佬任选9他不是这么玩的啊 没错是14场选9场 但是每场比赛有三种结果 你列的只是3种结果全选的情况下的, 而且你这底数14我实在没看懂,我选了10场比赛 复式也该是C(10,9)啊,怎么能算出来C(14,10)呢 而且我有的比赛是可以选择两种或者只选一种结果的啊,你后面这3^9明显是不对的。
tianfang 2017-04-21
  • 打赏
  • 举报
回复
2楼就给你列出了啊 “组合(9,14)” 是14个选9个组合数,这个你会算吧,9个,10个给你列出了 ,后面自己补全了啊
爱打代码不 2017-04-20
  • 打赏
  • 举报
回复
引用 5 楼 tianfang 的回复:
b 和c 代表什么?我认为是重复了
b[]中的数字必须是a[]里的 c[]中的数字必须是b[]里的 b[]和c[]长度可以不一样,但是b[]的长度一定是大于或者等于c[]的长度的
tianfang 2017-04-20
  • 打赏
  • 举报
回复
b 和c 代表什么?我认为是重复了
爱打代码不 2017-04-20
  • 打赏
  • 举报
回复
给几个例子吧 1. a[]={0,1,2,3,4,5,6,7,8,9} b[]={} c[]={} count=28 2. a[]={0,1,2,3,4,5,6,7,8,9,10} b[]={0,1,2} c[]={0,1,2} count=981 3. a[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13} b[]={0,1,2,3} c[]={0,1,2,3} count=50122
爱打代码不 2017-04-20
  • 打赏
  • 举报
回复
引用 2 楼 tianfang 的回复:
9场比赛,任选9场,组合(9,14);9场比赛3种结果,排列的个数是3的9次方。总数是组合(9,13)*3^9 10场:组合(10,14)*3^10 ……
不对啊老铁...
tianfang 2017-04-20
  • 打赏
  • 举报
回复
9场比赛,任选9场,组合(9,14);9场比赛3种结果,排列的个数是3的9次方。总数是组合(9,13)*3^9 10场:组合(10,14)*3^10 ……
爱打代码不 2017-04-20
  • 打赏
  • 举报
回复
引用 5 楼 tianfang 的回复:
b 和c 代表什么?我认为是重复了
仔细说明一下吧 任选9是14场比赛至少选择9场 所以我从0~13中至少取9个数字 每场比赛包含胜平负三个选项 a里存的是出现过的场次 b里存的是出现过两个选项的场次 c里存的是出现过三次的场次 比如说 我选了第0~9场比赛 a[]={0,1,2,3,4,5,6,7,8,9} 其中第0,1,2,3,4,5场比赛我至少选了两个个选项 b[]={0,1,2,3,4,5} 第4,5场次比赛我选择了所有选项 c[]={4,5}
爱打代码不 2017-04-19
  • 打赏
  • 举报
回复
有大佬没有啊 亲们

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧