初学者-对排列和组合不知道怎么办了

问题描述

对排列和组合不知道怎么办了

对排列和组合比较陌生,所以,希望大神能解释一下————初学者,最好用C语言,嘿嘿,太复杂的看不懂。

解决方案

排列组合的定义:
http://blog.sina.com.cn/s/blog_6e5bd60d0100uo49.html

c语言举例:
http://blog.csdn.net/tjyyyangyi/article/details/7906677

解决方案二:

 将数组看为一个集合,将集合分为两部分:0~s和s~e,其中0~s表示已经选出来的元素,而s~e表示还没有选择的元素。

perm(set, s, e)
{

    顺序从s~e中选出一个元素与s交换(即选出一个元素)
    调用perm(set, s + 1, e)
    直到s>e,即剩余集合已经为空了,输出set
}
c语言代码如下:

void perm(int list[], int s, int e, void (*cbk)(int list[]))
{
    int i;
    if(s > e)
    {
        (*cbk)(list);
    }
    else
    {
        for(i = s; i <= e; i++)
        {
             swap(list, s, i);
             perm(list, s + 1, e, cbk);
             swap(list, s, i);
        }
    }
}
其中:

void swap(int * o, int i, int j)
{
    int tmp = o[i];
    o[i] = o[j];
    o[j] = tmp;
}

解决方案三:

 组合,每一次从集合中选出一个元素,然后对剩余的集合(n-1)进行一次k-1组合。

comb(set, subset, n, k)
{

    反向从集合中选出一个元素,将这个元素放入subset中。
    调用comb(set, subset, n-1, k-1)
    直到只需要选一个元素为止
}
C语言代码如下:

void combine(int s[], int n, int k, void (*cbk)(int * subset, int k))
{
    if(k == 0)
    {
        cbk(subset, k);
        return;
    }

    for(int i = n; i >= k; i--)
    {
        subset[k-1] = s[i-1];
        if(k > 1)
        {
            combine(s, i-1, k-1, cbk);
        }
        else
        {
            cbk(subset, subset_length);
        }
    }
}
时间: 2024-12-06 08:11:03

初学者-对排列和组合不知道怎么办了的相关文章

使用F#的排列与组合

理解排列与组合是进行软件测试所需的一项基本技能.在本月的"测试运行"专栏中,我将向您展示如何使用以新 F# 语言编写的代码来处理排列与组合. 数学组合是指从包含 n 项的集合中选择 k 项作为子集,不考虑其中的顺序.例如,如果 n = 5 且 k = 2,需要从五项中选择二项,则所有可能的组合为: {0,1}, {0,2}, {0,3}, {0,4}, {1,2}, {1,3}, {1,4}, {2,3}, {2,4}, {3,4} 请注意,我没有列出组合 {1,0},这是因为它与 {

C语言实现的阶乘,排列和组合实例_C 语言

本文实例讲述了C语言实现的阶乘,排列和组合.分享给大家供大家参考.具体如下: #include<stdio.h> int Factorial(int n) { int i=0; int sum=1; int array[]={0}; for(i=n;i>=1;i--) { sum=sum*i; } return sum; } int Arrangement(int n,int m) { int result=0; if(m>n) { printf("您的输入有错,上边的数

PHP输出多个元素的排列或组合的方法

实例如下: <?php $arr = array('a','b','c','d'); $result = array(); $t = getCombinationToString($arr, 1); print_r($t); $t = getCombinationToString($arr, 2); $t2 = getunique($t); print_r($t2); $t = getCombinationToString($arr, 3); $t2 = getunique($t); print

递归枚举排列、组合的C#源码

递归 大约是2001年时候用VS7 beta写的一点东西了,现在回看起来不是一般的幼稚...好处是还能运行:),看到CSDN上有朋友要C# 的代码,我也不揣简陋,献丑了.(转换成VS03的工程了)  Combinatorics.cs代码清单 using System;using System.Collections;using System.Data;      /// <summary>     /// 组合数学函数集     /// </summary>     public 

基于排列与组合输出多少中情况详解_C 语言

排列 复制代码 代码如下: #include <stdio.h>// 主要是找到当前要排的 和后面要排数的关系int swap(int m,int n){ if(n==1)  return m-n+1; return  m*swap(m-1,n-1); }int main(){ int m=5,n=4; printf("%d",swap(5,4)); } 组合 计算3个A,2个B可以组成多少种排列的问题 思路一: 复制代码 代码如下: #include <stdio.

关于各种排列组合java算法实现方法

一.利用二进制状态法求排列组合,此种方法比较容易懂,但是运行效率不高,小数据排列组合可以使用 复制代码 代码如下: import java.util.Arrays; //利用二进制算法进行全排列 //count1:170187 //count2:291656 public class test { public static void main(String[] args) { long start=System.currentTimeMillis(); count2(); long end=S

.NET平台开源项目速览(11)KwCombinatorics排列组合使用案例(1)

    今年上半年,我在KwCombinatorics系列文章中,重点介绍了KwCombinatorics组件的使用情况,其实这个组件我5年前就开始用了,非常方便,麻雀虽小五脏俱全.所以一直非常喜欢,才写了几篇文章推荐给大家.最近在计算足球彩票结果组合过程中,使用的到了其功能,生成排列,非常具有代表性,而且也有网友咨询过类似的问题,所以就封装为扩展方法,方便调用.         NET开源目录:[目录]本博客其他.NET开源项目文章目录 彩票数据资料目录:[目录]C#搭建足球赛事资料库与预测平

转 排列组合

(常考)错位排列 有N封信和N个信封,每封信都不装在自己信封里的排列种数记作Dn,则 D1=0,D2=1,D3=2,D4=9,D5=44,D6=265 一.相邻问题---捆绑法 不邻问题---插空法 对于某几个元素不相邻的排列问题,可先将其他元素排好,再将不相邻元素在已排好的元素之间及两端空隙中插入即可. [例题1]一张节目表上原有3个节目,如果保持这3个节目的相对顺序不变,再添进去2个新节目,有多少种安排方法? A.20 B.12 C.6 D.4 [答案]A. [解析] 以下内容需要回复才能看

【原创】开源.NET排列组合组件KwCombinatorics使用(一)—组合生成

       本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1.[原创]开源.NET排列组合组件KwCombinatorics使用(一)-组合生成  2.[原创]开源.NET排列组合组件KwCombinatorics使用(二)--排列生成 3.[原创]开源.NET排列组合组件KwCombinatorics使用(三)--笛卡尔积组合 前言 本文今天介绍的.NET开