從 N 個元素中選取 M 個元素, 有多少種組合

2021-09-26 02:50:54 字數 1936 閱讀 9364

////

//演算法 : 從 n 個數字中選取 m 個, 列印所有可能組合

////

////

使用乙個輔助陣列 aux[1..m] 用來記錄 input[1..n] 中被選中元素的索引

//比如 input[i] 被選中, 那麼中會有一項 aux[*] = i

////

//從後向前計算:

//基本思想是, 從 n 個元素中選取 m 個, 首先選取第 m 個, 然後在從剩下的選取 m - 1 個。

////

對於 aux[m] 有選擇的數目: (從 input 的沒被用到的最後乙個) ~ input[m]。

//止於 input[m] 的原因是因為再向前的話, aux[0..m-1] 可以選擇的 input 數目會不足。

////

這裡 m 表示的是還剩幾個元素沒有選, 初始化的時候值為 m

void combination1(char input, const

int n, int aux, int m, const

int m, int &counter)

if (m > 1) //

還沒選完, 從 input[0..i-1] 中選取剩下的 m-1 個元素

else

//選擇完畢

cout

<< "}"

<}

}}void combination1(char input, const

int n, const

intm)

////

從前向後計算:

//基本思想是: 從 n 個元素選取 m個, 首先選取第 1 個, 其餘 m - 1 個元素從剩下的元素中選取。

////

[begin*************x******n-1]

//[0....m******m-1]

//n - 1 - x = m - 1 - m

//x = n - m + m

//aux[m] 選擇範圍: [input[begin], input[x]]

////

這裡的 m 表示選擇了多少個元素, 初始值為 0

void combination2(char input, const

int begin, const

int n, int aux, int m, const

int m, int &counter)

if (m < m - 1) //

沒選擇完, 從餘下的 input[i+1..n] 中選擇餘下的元素

else

cout

<< "]"

<}

}}void combination2(char input, int n, int

m)//

//回溯法

//flag 大小和 input 相同

//flag[i] 用來記錄 input[i] 是否被選中

//n 表示有多少個 input 元素參與了選擇

//m 表示選擇了多少個元素

void back_tracking(char input, bool flag, const

int n, const

int m, int n, int m, int &counter)

}cout

<< "

>

"<}

else

if (m >= m || n >= n ) //

n >= n 說明把 input 挑了個遍, 也沒湊齊 m 個元素

else

}void back_tracking(char input, int n, int

m)void

select_m_from_n()

在N個元素中選取前M個元素

import org.junit.test public class solution int arr maxarr arr,3 for int i 0 i 5 i 問題 在n個元素中選取前m個元素 思路 1 建立長度為m的陣列,作為最小堆 或則arr 0,m 1 構建小頂堆 3 先往最小堆中存入一...

Python 從列表中選取任意個元素求和

碰到乙個比較好玩的問題,我有許多小額的發票,需要從這些發票中湊出乙個指定的整數來。怎麼去實現呢?這些小額發票,我們可以用乙個列表來表示。比如a 1,3,5,6,8 那麼這個列表的元素可能產生多少種組合呢?由於列表裡面每乙個元素都可能有,也可能沒有。所以這裡面就有2的5次方種變化。驗證 ps 參考cs...

N個元素中選最大最小

n 個元素中選最大最小 問題描述 從n 個元素中,選出最大元素和最小元素。分析複雜度。方法 方法有三種。方法一 最笨的方法,迴圈一次找出最大的算素。再迴圈一下找到最小的。這裡2 次迴圈可以放在一起,作為小小的優化。比較次數 2 n 1 2n 2。void select max min 1 int a...