this.Label1.Text = "可能的组合是: <br> ";
            for (int u = 1; u < 100; u++)
            {
                for (int v = 0; v < 4; v++)
                {
                    for (int w = 0; w < 4; w++)
                    {
                        for (int z = 0; z < 10; z++)
                        {
                            for (int y = 0; y < 10; y++)
                            {
                                for (int x = 0; x < 10; x++)
                                {
                                    if (u + 2 * v + 3 * z + 4 * z + 5 * y + 6 * x == 100)
                                    {
                                        this.Label1.Text += "选择题:" + u + "多选题" + v + "是非题:" + w + "填空题:" + z + "改错题:" + y + "问答题:" + x + "<br>";
                                    }
                                }
                            }
                        }
                    }
                }
            }这个方法 系统会崩溃 能不能给个好的算法??

解决方案 »

  1.   

    (1)用一个程序生成一个文件,然后.Text从这里读进来。只生成一次!
    (2)我想你首先需要考虑一个总问题,你显示的这些东西,别人都会看吗?为什么要这样显示???如果不是,我想你在显示方式上做一些调整。
    (3)看你的意思我想可以做的调整很多了。
    试着写了一个,还可以再优化一些计算部分: this.label1 = "可能的组合是:   <br>   ";
                for (int x = 0; x < 10; x++)
                {
                    int ym = (100 - 6 * x) / 5;
                    ym = ym > 10 ? 10 : ym;
                    for (int y = 0; y < ym; y++)
                    {
                        int zm = (100 - 6 * x - 5 * y) / 4;
                        zm = zm > 10 ? 10 : zm;
                        for (int z = 0; z < zm; z++)
                        {
                            int wm = (100 - 6 * x - 5 * y - 4 * z) / 3;
                            wm = wm > 4 ? 4 : wm;
                            for (int w = 0; w < wm; w++)
                            {
                                int vm = (100 - 6 * x - 5 * y - 4 * z - 3 * w) / 2;
                                vm = vm > 4 ? 4 : vm;
                                for (int v = 0; v < vm; v++)
                                {
                                    int u = 100 - 6 * x - 5 * y - 4 * z - 3 * w - 2 * v;
                                    this.label1 += "....";
                                }
                            }
                        }
                    }
                }
            }
      

  2.   

    谢谢 phy 有没更好的算法 for (int x = 0; x < k; x++) k有十万条题目库,机器死掉了,能介绍能优化的方法吗?
      

  3.   

    你给这一行代码:
     for   (int   x   =   0;   x   <   k;   x++)  
    这个还能优化么?
    这已经是表达的最精确的意思了,中间没有计算。所以没办法做任何优化,但是放到实际环境中,结合循环里面实际执行的推荐仍然是有可能优化的。如果真要做优化的话,象你这种有10W条记录的情况。我建议从两个方面着手:
    (1)加入更多的限制条件,可以显著的减少循环或者尝试的次数。
    以我上面提供的算法为便,主要就是结合之前已经选定的其它题型已经使用过的分数,来限制其它题型可能选择的范围。当你的选择题选择了99的时候,任何其它题目都无法被选择了,不是吗?
    (2)将实时的行为改为静态的或者相对静态的行为。例如以上面的算法为便。你其实是要计算出所有可能的出题组合。不过你需要明白,这种组合是不会发生变化的(除非题型的分值变化),所以你可以采用我一开始提供的方案一,先静态生成,然后使用的时候读取出来。这样子实际上比任何优化都有效。从这个角度扩展开来,实际上就是一个优化你的业务流程的问题。不要把什么工作都堆到一起做,也不要把重复做不必要的工作。在设计时就可以极大的提高效率!
      

  4.   

    to  bo3235  这个是客户需要 我已经做出固定题型组合 可是客户说不需要这样 郁闷
      

  5.   

    to Phy 我想你首先需要考虑一个总问题,你显示的这些东西,别人都会看吗?为什么要这样显示???如果不是,我想你在显示方式上做一些调提供给客户要求 能提供 排列组合有多少种  客户-->选择其中一种 -->生成考试题目
    生成txt 静态的 总分不一定是100分 有可能150分 生成txt就不对了  
    郁闷 就没有其它的解决方法了 排列组合是种算法,向这种情况要用什么算法? 
      

  6.   

    pay 说的很正确.
    客户有的想法真的想法真是太奇怪了.
    开始做一个项目还是先把需求写好吧.
      

  7.   

    俺的毕业设计是随机生在试卷.哈哈.还是个校级优秀(.doc,html).
    快下班了,我说下我的细路.
    我用类似.net2.0 wizard 向导,过滤每种题型.可选可不选.
    LZ 的话,用户选择2种题型.那不是浪费很多资源吗???
    总分可以设置 100 
    向导1;
    100-选择题(管理员输入分值,选择题数目)---数据库当中用 select   top 选择题数目 表 order by newid()
    向导2; 
    100-选择题数目-多选题
    ......
    主要是细路,别的你在优化.最后,剩多少就多少了.
    总之.LZ 考虑下能不能用加减运算解决问题.给管理员多点选择题型的机会吧!!