求.NET的一个排列组合

问题描述

如1,2,3要求输出1,12,123,13,2,23,3所有组合,不考虑输出顺序不能有重复的数据。

解决方案

解决方案二:
f(n)=2*f(n-1)+1
解决方案三:
引用1楼的回复:

f(n)=2*f(n-1)+1

f(1)=1之后直接for都可以写出来了。。。
解决方案四:
从后第一个往前拼接,循环n-1遍,把结果保存到result。再从后第二个往前拼接,循环n-2遍,把结果合并到result。依次。。。。。最后得到所有result。
解决方案五:
1,2,3,4,5第一遍:12345=》15,25,35,45第二遍:1525=》12535=》135,23545=》145,245,345第三遍:125135235=》1235145245=》1245345=》1345,2345第四遍:1235124513452345=》12345最后得到:15,25,35,45125,135,235,145,245,3451235,1245,1345,234512345
解决方案六:
引用2楼的回复:

引用1楼的回复:f(n)=2*f(n-1)+1f(1)=1之后直接for都可以写出来了。。。

这里说的不对。。。
解决方案七:
参考//-----------------------------------------------------------------------------////算法:排列组合类////版权所有(C)Snowdust//个人博客http://blog.csdn.net/snowdust&http://snowdust.cnblogs.com//MSN&Emailsnowdust77@sina.com////此源代码可免费用于各类软件(含商业软件)//允许对此代码的进一步修改与开发//但必须完整保留此版权信息////-----------------------------------------------------------------------------///<summary>///递归算法求数组的组合(私有成员)///</summary>///<paramname="list">返回的范型</param>///<paramname="t">所求数组</param>///<paramname="n">辅助变量</param>///<paramname="m">辅助变量</param>///<paramname="b">辅助数组</param>///<paramname="M">辅助变量M</param>privatestaticvoidGetCombination<T>(refList<T[]>list,T[]t,intn,intm,int[]b,intM){for(inti=n;i>=m;i--){b[m-1]=i-1;if(m>1){GetCombination(reflist,t,i-1,m-1,b,M);}else{if(list==null){list=newList<T[]>();}T[]temp=newT[M];for(intj=0;j<b.Length;j++){temp[j]=t[b[j]];}list.Add(temp);}}}///<summary>///求数组中n个元素的组合///</summary>///<paramname="t">所求数组</param>///<paramname="n">元素个数</param>///<returns>数组中n个元素的组合的范型</returns>publicstaticList<T[]>GetCombination<T>(T[]t,intn){if(t.Length<n){returnnull;}int[]temp=newint[n];List<T[]>list=newList<T[]>();GetCombination(reflist,t,t.Length,n,temp,n);returnlist;}

应用int[]arr={1,2,3};List<int[]>result=newList<int[]>();for(inti=0;i<arr.Length;i++){result.AddRange(GetCombination(arr,i+1));}//输出foreach(int[]varrinresult){foreach(intvnuminvarr){Console.Write(vnum.ToString()+"");}Console.WriteLine("");}/*321231312123*/

解决方案八:
1,2,3,4,5第一遍:12345=》15,25,35,45,14,24,34,13,23,13第二遍:25=》12535=》135,23545=》145,245,34524=》12434=》134,23423=》123第三遍:235=》1235245=》1245345=》1345,2345234=》1234第四遍:2345=》12345最后:15,25,35,45,14,24,34,13,23,13125,135,235,145,245,345,124,134,234,1231235,1245,1345,2345,123412345
解决方案九:
staticvoidMain(string[]args){ShowResult();}publicstaticvoidShowResult(){stringstr="1,2,3";string[]temp1=str.Split(',');List<string>list=newList<string>();foreach(stringsintemp1){if(list.Count==0)list.AddRange(temp1);elselist.AddRange(JoinPart(list,s));}foreach(stringsinlist)Console.WriteLine(s);}publicstaticList<string>JoinPart(List<string>part1,strings){List<string>result=newList<string>();foreach(stringstr1inpart1){result.Add(str1+s);}returnresult;}/*123122232132333123223323*/

解决方案十:
学习了!八楼的应该是正解!
解决方案十一:
8楼+1
解决方案十二:
楼上的,你们什么眼神,这里只有6楼给的是最佳答案,而8楼给的直接是错误的算法,从输出内容就看得出来,不是组合而是排列,出现了重复“23”和“32”重复。
解决方案十三:
引用11楼的回复:

楼上的,你们什么眼神,这里只有6楼给的是最佳答案,而8楼给的直接是错误的算法,从输出内容就看得出来,不是组合而是排列,出现了重复“23”和“32”重复。

楼上的眼睛看勋章去了,呵呵。
解决方案十四:
其实1楼给的公式也没错,非常正确。这里的f(n)就是组合数,但要将内容显示则是通过循环+二进制位运算,其效率是最高的算法,因为没有比位运算的效率更高的算法,其中只用到循环而没有用到递归。另外他这个f(n)的求解比较麻烦,永远是依赖上个值,意味着要递归求解,因此我改下算法,变为这样:f(n)=2^n-1,这样计算就方便多了。下面给出最佳算法,速度非常快。publicstaticList<List<T>>GetCombination<T>(T[]t){List<List<T>>result=newList<List<T>>();intlength=t.Length;intnum=(int)Math.Pow(2,length)-1;for(inti=1;i<=num;i++){List<T>tmp=newList<T>();for(intj=0;j<length;j++){if((i>>j)%2==1)tmp.Add(t[j]);}result.Add(tmp);}returnresult;}staticvoidMain(string[]args){int[]arr={1,2,3};List<List<int>>result=GetCombination(arr);foreach(List<int>varrinresult){foreach(intvnuminvarr){Console.Write(vnum.ToString()+"");}}}/*输出121231323123*/

解决方案十五:
膜拜算法帝最愁就是写算法了o(︶︿︶)o唉
解决方案:
System.Collections.Generic.List<string>sum;protectedvoidPage_Load(objectsender,EventArgse){sum=newSystem.Collections.Generic.List<string>();System.Collections.Generic.List<int>list=newSystem.Collections.Generic.List<int>(){1,2,3};bind(list,newSystem.Collections.Generic.List<int>(),0,1);foreach(stringsinsum.OrderBy(t=>t.Length))Response.Write(s);}privatevoidbind(System.Collections.Generic.List<int>list,System.Collections.Generic.List<int>source,intindex,intcount){if(source.Count<=count){printf(source);}for(inti=index;i<list.Count;i++){if(source.Contains(list[i]))continue;source.Add(list[i]);bind(list,source,i,count+1);source.Remove(list[i]);}}privatevoidprintf(System.Collections.Generic.List<int>List){for(inti=0;i<List.Count-1;i++)if(List[i]>=List[i+1])return;stringstr="";for(inti=0;i<List.Count;i++){str+=List[i];if(i<List.Count-1){str+=",";}}str+="<br/>";sum.Add(str);}
解决方案:
引用13楼的回复:

其实1楼给的公式也没错,非常正确。这里的f(n)就是组合数,但要将内容显示则是通过循环+二进制位运算,其效率是最高的算法,因为没有比位运算的效率更高的算法,其中只用到循环而没有用到递归。另外他这个f(n)的求解比较麻烦,永远是依赖上个值,意味着要递归求解,因此我改下算法,变为这样:f(n)=2^n-1,这样计算就方便多了。下面给出最佳算法,速度非常快。C#codepubl……

这个用位操作的算法貌似真的很厉害

时间: 2024-12-26 10:29:06

求.NET的一个排列组合的相关文章

数组-想找到一个排列组合的算法

问题描述 想找到一个排列组合的算法 比如数组里有1-500的非连续数值, 当传入345这样一个数值进来时, 可以从数组里拿出N个数值相加得到345这个值的方案, 且要求相加数值个数最少,或最接近的组合优先获取出来 解决方案 2009年1月15日 沈阳 晴?? 为解决1月7日遇到的排列组合的难题,进行了以下题目的研究,并用C#实现了一个非递归的算法.有一个List,List中存有N个对象,要求做出这N个对象所有无序组.?数学公式:组合数=C(n1) + C(n2) + ...... + C(nn)

java算法-求可变参数的排列组合代码思想?就是 m从选n个 作为组合 m是可变的 n也是?如何解

问题描述 求可变参数的排列组合代码思想?就是 m从选n个 作为组合 m是可变的 n也是?如何解 求可变参数的排列组合代码思想?就是 m从选n个 作为组合 m是可变的 n也是?如何解 解决方案 这个简单,就是递归. 从m选n的算法可以分解为 for each 遍历m,选取1个+ (从剩下的m-1个元素中任选n-1个) 直到从1个元素中选择1个.

请教一个排列组合问题

问题描述 其实我非常不知道为啥要当程序员,应该当个小美工==||这样很少能用脑子吧..从小脑子就缺弦的人,只能发帖求救...有个问题哈.这样的:例子:XXXOO这个例子需要组合成不同的格式,比如XOXXOXXOXOOOXXXOXXXO类似以上的形式!!那问题来了.直接用脑子一个一个想,貌似还可以在纸上画出来,可是用程序咋能计算出不重复的组合有多少组呢?或者给个计算公式.或者什么思路的神马都可以的==||数学学的不好我也是醉了.拜托了==||另外在弱弱的问下,如果是XXOOO这样,又能组合多少呢.

排列组合算法

    排列:从n个不同元素中,任取m(m<=n)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列:从n个不同元素中取出m(m<=n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号A(n,m)表示. A(n,m)=n(n-1)(n-2)--(n-m+1)= n!/(n-m)! 此外规定0!=1     组合:从n个不同元素中,任取m(m<=n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合:从n个不同元素中取出m(m<=

浅析实现排列组合查询算法

所谓的排列组合查询就相当于GOOGLE高级查询中"包含以下全部的字词"查询,也就是说查询中必须包含所有查询关键词,而且他们的顺序可以是任意.以下程序段实现了这一功能.比如输入查询关键字:tom tina则最一般的情况是在程序中使用类似于"select sex from student where name like '%tom%tina%' or name like '%tina%tom%' ordered by age" 的查询语句实现以上的查询,因此如何得到'%

参数的排列组合2

参数的排列组合2 参数的取值范围是:["a","b","c","d"],求其所有的排列组合 先给出答案: 共15个,分别是: abc, d, abd, b, c, a, ac, ad, bcd, ab, bc, acd, abcd, bd, cd 单元测试: @Test public void test_factorialaa(){ String base[]=new String[]{"a","

java数组-Java计算排列组合 用java计算0,1,2,3这三个数每一行出现一个数,共有15行这样的数,如何求

问题描述 Java计算排列组合 用java计算0,1,2,3这三个数每一行出现一个数,共有15行这样的数,如何求 用java计算0,1,2,3这三个数每一行出现一个数,共有15行这样的数,如何求 解决方案 我觉得你的问题实在是很模糊,我刚好对java多线程懂一些,所以多问两句: 计算的是什么样的排列组合? 0,1,2,3 的 15行这样的数是哪样的数? 三个数? 每一行出现一个数? 麻烦解释一下~ 另外一个小建议:以后不要这样提问题啦~那些懂的人就算看到也会懒得回答的哦.提问要清晰明确~ 解决方

求一个排列问题,谢谢~~~

问题描述 求一个排列问题,比如:原始数据是1.2.(项目中实际用到的数据是1-10)全排列是:111221(与12重复,所以就不要了)22我要的数据是:111222怎么做?谢谢~~~ 解决方案 解决方案二:你倒是先写个全排列出来啊解决方案三:设置一个计数器,统计下元素被调用的次数,这个方案可行不?解决方案四:排是可以排,不过1-10的结果会非常大.解决方案五:我先写一个示例出来吧:varindex=1;for(varindex01=1;index01<=2;index01++){varindex

java-JAVA 生成 用0到9这十个数字 所有的排列组合(0不能再第一个)

问题描述 JAVA 生成 用0到9这十个数字 所有的排列组合(0不能再第一个) 用 0到9 生成 十位数的所有排列组合,数字0不能在第一个,这个生成的十位数, 不能有重复的数字. 解决方案 public static void main(String[] args) { String str[] = { "0", "1", "2", "3", "4", "5", "6"