问题描述
如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……
这个用位操作的算法貌似真的很厉害