读书人

求算法小弟我想了好几天了

发布时间: 2012-04-01 17:23:46 作者: rapoo

求算法,我想了好几天了
有一个数组,长度已知,但里面的内容有可能重复。
比如说这个数组是 "10 ", "15 ", "51 "(1), "51 "(2), "82 ",要求把它们组合,组合结果放到collection中。
组合后的样子:
col: "10 "
col: "10 ", "15 "
col: "10 ", "51 "(1)
col: "10 ", "51 "(2)
col: "10 ", "82 "
col: "10 ", "15 ", "51 "(1)
col: "10 ", "15 ", "51 "(2)
col: "10 ", "15 ", "82 "
col: "10 ", "51 "(1), "82 "
col: "10 ", "51 "(2), "82 "
col: "10 ", "15 ", "51 "(1), "82 "
col: "10 ", "15 ", "51 "(2), "82 "
col: "15 "
col: "15 ", "51 "(1)
......
col: "82 "

[解决办法]
Array a=new Array(a1,a2,a3,a4,a5,a6,a7);
for(int i=0;i <2^(a.Length);i++)
{
String str=Convert.ToString(i,2);
for(int j=0:j <a.Length-str.Length;j++)
{
str= "0 "+str;
}
string out;
for(int k=0;k <a.Length;k++)
{
if(str.SubString(k,1)== "0 ")
{
out+= " ";
}
else
{
out+=a[k];
}
}
Console.Writeline(out);
}
[解决办法]
组合放到collection里有没有顺序要求?

事实上, 数组长度为N的话, 最后Collection的元素个数一定是2^N-1
用N bit表示数组N个元素是否被选中, 这样共有2^N种选择, 去掉空集

程序实现上, 可以int i=1; i <=(1 < <N); ++i
对于每个i, 按第k位bit是否是1, 来决定数组第K个元素是否被选中, 循环完毕后, 所有的组合数也就生成了.
[解决办法]
#include "stdafx.h "
#include "iostream "
#include "vector "
using namespace std;

int main()
{
int arrIn[6]={2,4,5,3,2,4};
int tail=0;
int arrlength=6;
int arrIndex[6]={1,0,0,0,0,0};
vector <int> arrOut;
while (tail <arrlength)
{
arrOut.clear ();
arrOut.resize (1+tail);
int raise=1;
int start=0;
int insert=1;
for (;start <=tail;start++)
{

if (arrIndex[start]==1)
{
arrOut.push_back (arrIn[start]);
cout < <arrOut[tail+insert] < < " ";
insert++;
}

arrIndex[start]+=raise;
if (arrIndex[start]==2)
{
arrIndex[start]=0;
raise=1;
}
else
{
raise=0;
}
}
if (raise==1)
{
tail++;
if (tail <arrlength)
arrIndex[tail]=1;
}
cout < <endl;
}


return 1;
}

读书人网 >软件架构设计

热点推荐