比如现在我有1,2,3这3个数,我想把这3个数组成如下的情况(不重复):1,1+2,1+3,1+2+3,2,2+3,2+4,3。
现随机输入几个数,用C#如何写出不重复的情况?

解决方案 »

  1.   

    本帖最后由 viena 于 2008-04-17 10:09:06 编辑
      

  2.   

    组合问题,看看组合的算法。取出来的个数一定是2吗?我一般这么做,如果是N取2的话(伪代码)
    RESULT[]; //存放所有组合的结果 
    //这里我们设计RESULT.FIND[X,Y] = RESULT.FIND[Y,X]   RESULT.ADD(X, Y) = RESULT.ADD(Y, X)FOR X = 1 TO N
      FOR Y = 1 TO N
      {
          //双重循环必然会有重复 比如:(1, 2)=(2, 1)
          IF (!RESULT.FIND[X,Y]) RESULT.ADD(X, Y); //如果没有这个组合,就把这个新的组合放入结果集
      }具体的算法不难实现
      

  3.   

    一般的组合问题就是从N个元素里面取出所有的组合情况,我那个解答只是取2的组合。
    参考这里的一些文章:
    http://topic.csdn.net/u/20071124/11/968809b3-12cd-455b-9f07-4c6938fa31fb.html
    http://www.dlog.cn/html/diary/showlog.vm?sid=2092&log_id=9597这个pdf详细论述了组合算法,简明扼要,有代码示例
    http://www.bxmy.org/article/combination.pdf
      

  4.   

    随便写的,若对效率不高的话,将就一下
            private void button1_Click(object sender, EventArgs e)
            {
                String[] s =  { "1", "2", "3"};
                ArrayList strSrc = new ArrayList();
                foreach (String str in s)
                {
                    strSrc.Add(str);
                }                
                ArrayList strRet = GetData(strSrc,String.Empty);
            }        private ArrayList GetData(ArrayList strSrc, String strBase)
            {
                ArrayList alRet = new ArrayList();
                int iCount = strSrc.Count;
                for (int i = 0; i < iCount; i++)
                {
                    alRet.Add(strBase + (String)strSrc[i]);
                    if (strSrc.Count > 1)
                    {
                        ArrayList alNewSrc = new ArrayList(strSrc);
                        for (int j = 0; j <= i; j++)
                        {
                            alNewSrc.RemoveAt(0);
                        }                    
                        ArrayList alTemp = GetData(alNewSrc, strBase + (String)strSrc[i]);
                        foreach (object obj in alTemp)
                        {
                            alRet.Add(obj);
                        }
                    }
                }
                return alRet;
            }
      

  5.   

    佩服.... 3个组合 应该是 C31+C32+C33 = 3+3*2/2*1+1 = 7 吧
    如果有5个数字就是 C51+C52+C53+C54+C55 =(5+5*4/2*1)*2 + 1 = 31吧建议7楼的再看看高中代数