组合问题非递归

组合问题非递归形式:

例如有5个数,选其中3个数 ,将其模拟成

1 1 1 0 0

1 1 0 1 0

1 1 0 0 1

1 0 1 1 0

1 0 0 1 1

0 1 1 1 0

..........

需要将每次交换后的1结合在一起。

 1 #include<cstdio>
 2 int b[25]={
 3     0
 4 } ;
 5 void Print(int len,int r)
 6 {
 7     int temp=0;
 8     for(int i=0;i<len;i++)
 9     {
10         if(b[i]==1)
11         {
12             temp++;
13             if(temp!=r)
14               printf("%d ",i+1);
15                else
16                  printf("%d\n",i+1);
17         }
18
19     }
20 }
21
22
23 int main(int argc, char *argv[])
24 {
25     int n,r;
26     scanf("%d%d",&n,&r);
27     //将b初始化为r个1
28     for(int i=0;i<r;i++)
29        b[i]=1;
30     int i;
31     //寻找 1 0 进行移位
32     do{
33         Print(n,r);
34         for( i=n-1;i>0;i--)
35         {
36             if(b[i]==0&&b[i-1]==1)
37             {
38                 int right=0;
39                 for(int j=n-1;j>i;j--)
40                 {
41                     if(b[j]==1)
42                       right++;
43                 }
44                 b[i]=1;
45                 b[i-1]=0;
46                 //移位 清1
47                 for(int j=i+1;j<=i+right;j++)
48                 {
49                    b[j]=1;
50                 }
51                 //移位 清0
52                 for(int j=i+right+1;j<n;j++)
53                 {
54                     b[j]=0;
55                 }
56                 break;
57             }
58         }
59     }while(i!=0);
60
61
62
63     return 0;
64 }

时间: 2024-10-10 22:35:12

组合问题非递归的相关文章

非递归实现:从给定的字典中抽出所有相加值SUM的全部组合

例如 dic = {0 : 1, 1 : 3, 2 : 5, 3 : 9, 4 : 4} SUM = 9 抽取组合为 3:9 2:5   4:4     (5+4=9) 0:1   1:3   2:5     (1+3+5=9) 本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标    代表的数被选中,为0则没选中.      首先初始化,将数组前n个元素置1,表示第一个组合为前n个数.      然后从左到右扫描数组元素值的"10"组合,找到第一个"

java组合算法(非递归)

package net.kitbox.util; import java.util.Iterator; import java.util.LinkedList; @SuppressWarnings("rawtypes") public class CombineIterator implements Iterator { //源数据 private int[] source; //结果数组大小 private int resultSize; //结果数组个数 private int s

算法:归并算法的递归与非递归形式

归并算法是将两个或两个以上的有序表组合成一个新的有序表,它的原理是:假设初始序列含有n个记录,则可以看成是n个有序子序列,两两归并,得到[n/2]个有序子序列,再次归并--不断重复直至归并到长度为n的有序序列,这样的排序方法称为2路归并排序. 实例一:递归形式的2路归并算法 #define MAXSIZE 4 int data[MAXSIZE] = {2,1,0,3}; /* * 功能:将from数组min到max-1下标数据排好序,最后的结果是to[min]...to[max-1] * 输入:

算法之归并排序的递归与非递归的实现

一.什么是归并排序 归并排序就是将多个有序的数据段合成一个有序的数据段,如果参与合并的只有两个有序的数据段,则称为二路归并.与快速排序和堆排序相比,其最大的特点是一种稳定的算法,算法的平均时间复杂度O(nlog2n). 二.归并排序的基本思路 (1).对于一个原始的待排序表,可以将R[1]到R[n]可以看做是n个长度为1的有序表,即分解. (2).进行第一趟归并,即将上述的n个子序两两合并,得到 n/2向上取整 个有序表,若n为奇数,则归并到最后一个子序列长度为1,即合并. (3).再将两个 n

矩阵连乘(动态规划非递归)

对于矩阵连乘机问题就不概述了,主要是找出最佳的结合方式使得整个式子的运算次数最少. 对于这个问题之所以用动态规划的原因点如下: 第一:由于矩阵连乘机本身可以划分为若干个子矩阵链连乘机,而且若干个子矩阵链的最优解组合起来就是原矩阵链的最优解. 第二:对于原矩阵链的不同划分中个子问题是存在重叠子问题. 所以当此问题用动态规划算法来解决时就会变得很简单,算法的精髓就是从子问题入手.自底向上一步一步的由子问题的最优解去找到更复杂的大问题的最优解, 当循环到原问题时得出即为原为题的最优解:而且在自底向上的

斐波那契数列的递归和非递归解法

//递归解法 function fib(n){ if(n < 1){ throw new Error('invalid arguments'); } if(n == 1 || n == 2){ return 1; } return fib(n - 1) + fib(n - 2); } //非递归解法 function fib(n){ if(n < 1){ throw new Error('invalid arguments'); } if(n == 1 || n == 2){ return 1

用递归和非递归的方法输出斐波那契数列的第n个元素(C语言实现)

费波那契数列(意大利语:Successione di Fibonacci),又译为费波拿契数.斐波那契数列.费氏数列.黄金分割数列. 在数学上,费波那契数列是以递归的方法来定义: {\displaystyle F_{0}=0} {\displaystyle F_{1}=1} {\displaystyle F_{n}=F_{n-1}+F_{n-2}}(n≧2) 用文字来说,就是费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出.首几个费波那契系数是: 0, 1, 1, 2, 3

8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来探讨一下非递归方案 实验结果令人还是有些失望,原来非递归方案的性能并不比递归方案性能高 代码如下: package com.newflypig.eightqueen; import java.util.Date; /** * 使用循环控制来实现回溯,解决N皇后 * @author [email pr

图论 深度优先搜索 广度优先搜索的非递归实现

深度优先遍历 1.深度优先遍历的递归定义 假设给定图G的初态是所有顶点均未曾访问过.在G中任选一顶点v为初始出发点(源点),则深度优先遍历可定义如下:首先访问出发点v,并将其标记为已访问过:然后依次从v出发搜索v的每个邻接点w.若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点(亦称为从源点可达的顶点)均已被访问为止.若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上述过程,直至图中所有顶点均已被访问为止. 图的深度优先遍历类似于树的