求算法,一个n长度的数组,要将数组分成n个组

问题描述

求算法,一个n长度的数组,要将数组分成n个组每个组将数组中的所有元素分成m份,且不能重复出现(m的值等于组号即第几组就是分几份,不考虑排序)如数组,List<int>arr=newList<int>{1,2,3};要分成3个组,第一个组和n个组是固定的第1个组将数组分成1份,即vargroup=newList<List<int>>{newList<int>{1,2,3}};第2个组把数组中所有元素分成2份,可能出现以下的分法:1、vargroup1=newList<List<int>>{newList<int>{1},newList<int>{2,3}};2、vargroup2=newList<List<int>>{newList<int>{1,2},newList<int>{3}};3、vargroup3=newList<List<int>>{newList<int>{1,3},newList<int>{2},};第n个组所所有元素分成n份即每个元素都独立为一份vargroup=newList<List<int>>{newList<int>{1},newList<int>{2},newList<int>{3},};

解决方案

解决方案二:
然后,什么算法?
解决方案三:
不能组合成有固定字符分隔的字符串,然后按照需要,获取,这样不是更好?
解决方案四:
http://ask.csdn.net/questions/178996
解决方案五:
引用3楼caozhy的回复:

http://ask.csdn.net/questions/178996

非常感谢,但这种方式好像还是无法实现我的要求,如{12345}划分成2个:除了这几种外1,234512,345123,451234,5还可能有:13,245134,25135,2414,235142,35....
解决方案六:
坐等高人来。
解决方案七:
等高手解答!
解决方案八:
引用4楼doveph的回复:

非常感谢,但这种方式好像还是无法实现我的要求,如{12345}划分成2个:除了这几种外1,234512,345123,451234,5还可能有:13,245134,25135,2414,235142,35....

这不就是先完成排列组合,再去做分组吗
解决方案九:
可以这样写staticvoidMain(string[]args){int[]a={1,2,3,4,5};varAs=AllocationScheme(a.Length,2);//获取分配方案do{foreach(varfinAs){intn=0;for(inti=0;i<f.Length;i++){vart=newint[f[i]];Array.Copy(a,n,t,0,f[i]);n+=f[i];Console.Write("[{0}]",string.Join(",",t));}Console.Write("");}Console.WriteLine("");}while(NextPermutation(a));//取得下一个排列}staticList<int[]>AllocationScheme(intm,intn){varres=newList<int[]>();if(n>m)returnres;vara=newint[n];inti=0;for(i=0;i<a.Length;i++)a[i]=1;a[0]+=m-n;res.Add((int[])a.Clone());i=0;while(i<a.Length-1){do{a[i]--;a[i+1]++;if(a[i]>=a[i+1]){res.Add((int[])a.Clone());}}while(a[i]>=a[i+1]);varj=i++;while(j>=0&&a[j--]==1)i=a.Length;}returnres;}staticboolNextPermutation(int[]a){intfirst=0;intlast=a.Length;intc,j,m,n;inti=last;i--;while(true){vart=i;i--;if(a[i]<a[t]){j=last;while(!(a[i]<a[--j]));c=a[i];a[i]=a[j];a[j]=c;m=t;n=last-1;while(m<n){c=a[n];a[n]=a[m];a[m]=c;m++;n--;}returntrue;}if(i==first){m=first;n=last-1;while(m<n){c=a[n];a[n]=a[m];a[m]=c;m++;n--;}returnfalse;}}}

[1,2,3,4][5][1,2,3][4,5][1,2,3,5][4][1,2,3][5,4][1,2,4,3][5][1,2,4][3,5][1,2,4,5][3][1,2,4][5,3][1,2,5,3][4][1,2,5][3,4][1,2,5,4][3][1,2,5][4,3][1,3,2,4][5][1,3,2][4,5][1,3,2,5][4][1,3,2][5,4][1,3,4,2][5][1,3,4][2,5][1,3,4,5][2][1,3,4][5,2][1,3,5,2][4][1,3,5][2,4][1,3,5,4][2][1,3,5][4,2][1,4,2,3][5][1,4,2][3,5][1,4,2,5][3][1,4,2][5,3][1,4,3,2][5][1,4,3][2,5][1,4,3,5][2][1,4,3][5,2][1,4,5,2][3][1,4,5][2,3][1,4,5,3][2][1,4,5][3,2][1,5,2,3][4][1,5,2][3,4][1,5,2,4][3][1,5,2][4,3][1,5,3,2][4][1,5,3][2,4][1,5,3,4][2][1,5,3][4,2][1,5,4,2][3][1,5,4][2,3][1,5,4,3][2][1,5,4][3,2][2,1,3,4][5][2,1,3][4,5][2,1,3,5][4][2,1,3][5,4][2,1,4,3][5][2,1,4][3,5][2,1,4,5][3][2,1,4][5,3][2,1,5,3][4][2,1,5][3,4][2,1,5,4][3][2,1,5][4,3][2,3,1,4][5][2,3,1][4,5][2,3,1,5][4][2,3,1][5,4][2,3,4,1][5][2,3,4][1,5][2,3,4,5][1][2,3,4][5,1][2,3,5,1][4][2,3,5][1,4][2,3,5,4][1][2,3,5][4,1][2,4,1,3][5][2,4,1][3,5][2,4,1,5][3][2,4,1][5,3][2,4,3,1][5][2,4,3][1,5][2,4,3,5][1][2,4,3][5,1][2,4,5,1][3][2,4,5][1,3][2,4,5,3][1][2,4,5][3,1][2,5,1,3][4][2,5,1][3,4][2,5,1,4][3][2,5,1][4,3][2,5,3,1][4][2,5,3][1,4][2,5,3,4][1][2,5,3][4,1][2,5,4,1][3][2,5,4][1,3][2,5,4,3][1][2,5,4][3,1][3,1,2,4][5][3,1,2][4,5][3,1,2,5][4][3,1,2][5,4][3,1,4,2][5][3,1,4][2,5][3,1,4,5][2][3,1,4][5,2][3,1,5,2][4][3,1,5][2,4][3,1,5,4][2][3,1,5][4,2][3,2,1,4][5][3,2,1][4,5][3,2,1,5][4][3,2,1][5,4][3,2,4,1][5][3,2,4][1,5][3,2,4,5][1][3,2,4][5,1][3,2,5,1][4][3,2,5][1,4][3,2,5,4][1][3,2,5][4,1][3,4,1,2][5][3,4,1][2,5][3,4,1,5][2][3,4,1][5,2][3,4,2,1][5][3,4,2][1,5][3,4,2,5][1][3,4,2][5,1][3,4,5,1][2][3,4,5][1,2][3,4,5,2][1][3,4,5][2,1][3,5,1,2][4][3,5,1][2,4][3,5,1,4][2][3,5,1][4,2][3,5,2,1][4][3,5,2][1,4][3,5,2,4][1][3,5,2][4,1][3,5,4,1][2][3,5,4][1,2][3,5,4,2][1][3,5,4][2,1][4,1,2,3][5][4,1,2][3,5][4,1,2,5][3][4,1,2][5,3][4,1,3,2][5][4,1,3][2,5][4,1,3,5][2][4,1,3][5,2][4,1,5,2][3][4,1,5][2,3][4,1,5,3][2][4,1,5][3,2][4,2,1,3][5][4,2,1][3,5][4,2,1,5][3][4,2,1][5,3][4,2,3,1][5][4,2,3][1,5][4,2,3,5][1][4,2,3][5,1][4,2,5,1][3][4,2,5][1,3][4,2,5,3][1][4,2,5][3,1][4,3,1,2][5][4,3,1][2,5][4,3,1,5][2][4,3,1][5,2][4,3,2,1][5][4,3,2][1,5][4,3,2,5][1][4,3,2][5,1][4,3,5,1][2][4,3,5][1,2][4,3,5,2][1][4,3,5][2,1][4,5,1,2][3][4,5,1][2,3][4,5,1,3][2][4,5,1][3,2][4,5,2,1][3][4,5,2][1,3][4,5,2,3][1][4,5,2][3,1][4,5,3,1][2][4,5,3][1,2][4,5,3,2][1][4,5,3][2,1][5,1,2,3][4][5,1,2][3,4][5,1,2,4][3][5,1,2][4,3][5,1,3,2][4][5,1,3][2,4][5,1,3,4][2][5,1,3][4,2][5,1,4,2][3][5,1,4][2,3][5,1,4,3][2][5,1,4][3,2][5,2,1,3][4][5,2,1][3,4][5,2,1,4][3][5,2,1][4,3][5,2,3,1][4][5,2,3][1,4][5,2,3,4][1][5,2,3][4,1][5,2,4,1][3][5,2,4][1,3][5,2,4,3][1][5,2,4][3,1][5,3,1,2][4][5,3,1][2,4][5,3,1,4][2][5,3,1][4,2][5,3,2,1][4][5,3,2][1,4][5,3,2,4][1][5,3,2][4,1],[5,3,4,1][2][5,3,4][1,2][5,3,4,2][1][5,3,4][2,1][5,4,1,2][3][5,4,1][2,3][5,4,1,3][2][5,4,1][3,2][5,4,2,1][3][5,4,2][1,3][5,4,2,3][1][5,4,2][3,1][5,4,3,1][2][5,4,3][1,2][5,4,3,2][1][5,4,3][2,1]

这是用排列做的,可能你需要的是组合[5,3,4,1][2]和[5,4,3,1][2][5,4,3][1,2]和[5,4,3][2,1]都算一组不过你没说

时间: 2024-09-09 20:23:59

求算法,一个n长度的数组,要将数组分成n个组的相关文章

在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素。

题目:在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素.要求:(1)给出算法的基本设计思想.(2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释.(3)说明你所设计算法的时间复杂度和空间复杂度. (1)基本的设计思想: 一个数字出现的次数超过了长度的一半, 那么我们可以这样认为这个数字出现的个数一定大于其他全部数字出现的个数之和.算法的步骤如下: ①设数组为data[],数组长度为n,i=1.置currentAxi

javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号

 具体题目是这样的: 从1--9中选取N个数字,组成不重复的N位数,从小到大进行编号,当输入其中任何一个数M时,能找出该数字对应 的编号.如 N=3,M=213. 输出:[123(1) , 132(2) , 213(3) , 231(4) , 312(5) , 321(6)]--->X=2 首先看到题目想到的是生成一个从少到大的全排列的数组,然后再遍历数组得到对应的序号(数组下标加1),又或者想到一个个从小到大的生成push进数组,然后判断该数是不是当前题目给的数,如果是的话要求的序号就是当前数

c语言先用scanf初始化了一个字符指针,之后再定义字符数组出现内存不可读,在线等,急求

问题描述 c语言先用scanf初始化了一个字符指针,之后再定义字符数组出现内存不可读,在线等,急求 #include #include int main() { char*s; scanf("%s",s); //printf("%sn",s); //int n = strlen(s); //printf("%dn",n); char ret[56]; return 0; } 解决方案 s只是指针变量,没有分配内存 char*s; s = mall

dp-动态规划(DP)算法求出一个问题的所有解

问题描述 动态规划(DP)算法求出一个问题的所有解 具体问题是: 假设有一个楼梯共有N步,你每次可以爬1步或2步.请编写一个函数来计算,有多少种不同的方法可以爬到顶. 此题给出的解如下: int climbStaris(int n){ if(n <= 1) return 1; if(n == 2) return 2; int p = 1, q = 2, curr; for( int i = 3; i <= n; ++i){ curr = p + q; p = q; q = curr; } re

java-JAVA中的排序,最近有一个工程需要排序算法,求算法大神....

问题描述 JAVA中的排序,最近有一个工程需要排序算法,求算法大神.... 就是list中有一组数据(id),要求将id按照id的一个属性(age)进行两两分组. 若是偶数:按照**age之差最小**的两个id进行分组,两两一组. 若是奇数,则将一个id轮空,剩余id仍按照 age之差最小 这一条件进行两两分组. 求大神解救.或者说说一说思路也行... 解决方案 这里面会用到哪个函数?或者大概步骤是如何的,小白求大家尽量详细点说.... 解决方案二: 给出样例数据和预期的结果. 分组也可以用数据

javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号_javascript技巧

具体题目是这样的: 从1--9中选取N个数字,组成不重复的N位数,从小到大进行编号,当输入其中任何一个数M时,能找出该数字对应 的编号.如 N=3,M=213. 输出:[123(1) , 132(2) , 213(3) , 231(4) , 312(5) , 321(6)]--->X=2 首先看到题目想到的是生成一个从少到大的全排列的数组,然后再遍历数组得到对应的序号(数组下标加1),又或者想到一个个从小到大的生成push进数组,然后判断该数是不是当前题目给的数,如果是的话要求的序号就是当前数组

图的算法问题 已知边的起止节点求其中一个系统节点总数

问题描述 图的算法问题 已知边的起止节点求其中一个系统节点总数 求大神帮我想个算法,我有n组数据对,src->target,展示出来就是数个有向无环图,每个分隔的图称为一个系统,要求给出两个数据我能知道这两个数在不在同一个系统以及这个系统的节点总数是多少.有没有什么简单可行的方法啊计算二叉树的节点总数"> 解决方案 无非就是递归遍历.你每个节点除了本身数据之外,加上一个bool值表示是否被遍历过,伪代码如下: int countNode(Node n) { int r = 0; n.

图片-初学小女子求问一个关于矩阵,中值滤波题目

问题描述 初学小女子求问一个关于矩阵,中值滤波题目 目前用的是VS2010,所以希望是C语言~多谢喇 望各方大神快快冒泡,解小女子一惑o(^▽^)o 解决方案 不是告诉你算法了么?就是用某个点周围8个点按照第二个矩阵的泉重求平均数,作为滤波后的值. 解决方案二: 打个比方,第二排第二个元素158,滤波以后等于多少呢? 我们看它和它四周的9个元素,是不是 160 163 167 159 158 155 153 155 157 和Mask每一项相乘相加再除以16 等于 (160*1+163*2+16

问题求助 数据结构-使用双栈实现中缀表达式求值一个字符栈一个数字栈

问题描述 使用双栈实现中缀表达式求值一个字符栈一个数字栈 程序写好没输出啊,急求啊......主要BUG 在Nibolansuanfa()这个自定义函数里面前面的可以忽略..... /*核心函数*/ double Nibolansuanfa(char *str,stack *s) { initstack(&s);//初始化栈 char st[20],tc,xy;//st[20]里面放数字字符串 int j=0,i=0,yxcount=0; double d; while(str[j]!='')