1. 程式人生 > >子集生成之遞迴演算法

子集生成之遞迴演算法

輸出,某個集合的全部子集;

遞迴實現,演算法思想和全排列差不多,主要差別就在於去判斷一下某個元素是否可取;

如果不明白請檢視本博主的遞迴演算法之全排列演算法

#include <cstdio>
#include <algorithm>
using namespace std;
void ziji(int n,int *B,int cur)
{
    if(cur==n+1)
    {
        for(int i=1;i<=n;i++)
        {
            if(B[i])printf("%d ",i);
        }
        printf("\n");
        return ;
    }
    B[cur]=1;
    ziji(n,B,cur+1);
    B[cur]=0;
    ziji(n,B,cur+1);
}
int main()
{
    int n,b[1005];
    scanf("%d",&n);
    ziji(n,b,1);
    return 0;
}

輸出某個排序是字典序全排列的第幾個排列

STL

#include<bits/stdc++.h>
using namespace std;
int main()
{
    char s[10];
    while(cin>>s)
    {
        int n=strlen(s);
        char s1[10];
        scanf("%s",s1);
        sort(s,s+n);
        int k=0;
        do
        {
            k++;
            if(strcmp(s,s1)==0)
            printf("%d\n",k);
        }while(next_permutation(s,s+n));
    }
    return 0;
}

相關推薦

子集生成演算法

輸出,某個集合的全部子集; 遞迴實現,演算法思想和全排列差不多,主要差別就在於去判斷一下某個元素是否可取; 如果不明白請檢視本博主的遞迴演算法之全排列演算法 #include <cstdi

二叉樹遍歷演算法

作者:石鍋拌飯  原文連結 二叉樹的遍歷演算法有多種,典型的有先序遍歷、中序遍歷、後序遍歷以及層序遍歷。而且這些遍歷的遞迴演算法較為簡單,程式碼很少,容易實現,本文就是彙總二叉樹遍歷的遞迴演算法,非遞迴演算法將在下一篇文章中進行總結。本文中用到的二叉樹例項如下:

左神第八課演算法

題目一 求n! 簡單得不想說 題目二 漢諾塔問題 古代有一個梵塔,塔內有三個座A、B、C,A座上有64個盤子,盤子大小不等,大的在下,小的在上(如圖)。有一個和尚想把這64個盤子從A座移到C座,但每次只能允許移動一個盤子,並且在移動過程中,3個座上的盤子始終

python演算法演算法

# -*- coding: utf-8 -*- import numpy as np # 遞迴演算法 i = 0 def my_Recursion(list, n): global i try: if list[i] == n:

演算法學習筆記演算法

遞迴演算法學習筆記遞迴演算法的基本思想:        遞迴演算法就是在程式中不斷反覆呼叫自身來達到求解問題的方法。使用遞迴演算法可以簡化程式碼編寫,提高程式的可讀性。重點是呼叫自身,要求待求解的問題能

php演算法排序

<?php function quickSort($arr) { if(count($arr) > 1) { $k=$arr[0]; $x=array(); $y=array(); $_size=count($arr);

資料結構與演算法

1、背景 現在很多App都有這個功能。使用者A來推薦使用者B來註冊,使用者B又推薦了使用者C來註冊,我們可以說,使用者C的“最終推薦人”為使用者A,使用者B的"最終推薦按人”也為使用者A,而使用者A沒有"最終推薦人"。 一般來說,我們會通過資料庫來記錄這種推薦關係。在資料庫表中,我們可以

演算法八皇后

八皇后問題核心: 1:同一行或者同一列不能放置皇后; 2:斜率為1/-1的對角線上不能有兩個皇后。 如圖: 實現原理:     #include<iostream> #include<cstdio> using std::

【資料結構與演算法的基本介紹---第六篇

一、遞迴的基本概念 1、定義 遞迴:指的是一個過程,函式直接或者間接的呼叫自己,此時則發生了遞迴。 遞迴的兩個要素:遞推公式和遞迴邊界 可以看到遞迴的定義非常的簡潔,但是理解起來就沒有這麼容易了。不知道大家是否和我一樣,在遇到遞迴問題的時候,總是試圖去一步一步的分

演算法-------

概念 遞迴:從已知問題的結果出發,用迭代表達式逐步推算出問題的開始的條件,即順推法的逆過程,稱為遞迴。 遞推:遞推演算法是一種用若干步可重複運算來描述複雜問題的方法。遞推

演算法

何時用遞迴 需滿足三個條件: 一個問題的解可以分解為幾個子問題的解 這個問題與分解之後的子問題,除了資料規模不同,求解思路完全一樣 存在遞迴終止條件 使用遞迴時注意要點 要注意避免堆疊溢位 要注意不要過量的重複性計算(可以利用map儲存計算值) 遞迴與迭

計算機演算法設計與分析與分治策略——二分搜尋技術

遞迴與分治策略 二分搜尋技術   我們所熟知的二分搜尋演算法是運用分治策略的典型例子,針對這個演算法,先給出一個簡單的案例。   目的:給定已排好序的n個元素a[0:n-1],現要在這n個元素中找出一特定的元素x。   我們首先想到的最簡單的是用順序搜尋方法,逐個比較a[0:n-1]中元素,直至找出元

[OpenJudge] 2.3基本演算法推 PKU2506Tiling

一、原題 9273:PKU2506Tiling 總時間限制: 2000ms 單個測試點時間限制: 1000ms 記憶體限制: 131072kB描述 對於一個2行N列的走道。現在用1*2,2*2的磚去鋪

ACM入門演算法---專場

遞迴演算法就是在函式或子過程的內部,直接或者間接地呼叫自己的演算法,在ACM中它是一個入門級的演算法,題目一般非常簡單。它一般解決三類問題: (1) 資料的定義是按遞迴定義的。(Fibonacci函式) (2) 問題解法按遞迴演算法實現。(回溯) (3) 資料的結構形式是按

【NOI】1755:菲波那契數列/ 2.2基本演算法和自呼叫函式

傳送門:檢視 1755:菲波那契數列總時間限制:  1000ms   記憶體限制:  65536kB 描述 菲波那契數列是指這樣的數列: 數列的第一個和第二個數都為1,接下來每個數都等於前面2個數之和。 給出一個正整數a,要求菲波那契數列中第

【NOI】1696:逆波蘭表示式/ 2.2基本演算法和自呼叫函式

傳送門:檢視 1696:逆波蘭表示式 總時間限制:  1000ms   記憶體限制:  65536kB 描述 逆波蘭表示式是一種把運算子前置的算術表示式,例如普通的表示式2 + 3的逆波蘭表示法為+ 2 3。逆波蘭表示式的優點是運算子之間

演算法設計與分析與分治策略

 分治法:     將一個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。 (1)可行性:如果原問題可分割成k個子問題(1<k<=n),且這些子問題都可解,並可利用這些子問題的解求出原問題的解,那麼分治法就是可行的。 (2)分治法與

二叉樹遍歷演算法

在前一篇文章二叉樹遍歷遞迴演算法對二叉樹遍歷的遞迴演算法做了總結,這篇文章就來對二叉樹遍歷的非遞迴演算法做個彙總。還是與上一篇文章一樣的順序,一一彙總先序、中序、後序以及層序遍歷的非遞迴演算法。 1、先序遍歷(非遞迴演算法) 先序遍歷非遞迴訪問,使用棧即可實現。先序遍

演算法因子分解

例一以20為例遞迴過程為#include <iostream> #include <string> #include <algorithm> #include <string.h> using namespace std; in

演算法(1)整數劃分問題解決

  今日,閱讀《ACM/ICPC 演算法訓練》時,發現一道名為“整數劃分”的題,書上解釋極為模糊,自己研究了一下此題,將其解決,記錄下解題思路,以備以後有用時快速理解;   一,題意簡述   將整數表示成一系列正整數之和:n=n1+n2+.....+nk;   注意:4+2