基礎演算法 組合問題

2021-10-05 02:23:17 字數 2381 閱讀 2024

import numpy as np

from numpy.core.fromnumeric import size

from numpy.ma.core import arange

# 元素集合

sample =

["a"

,"b"

,"c"

,"d"

,"e"

,"f"

,"g"

,"h"

]# 對應的int陣列

book = np.random.randint(0,

1,len(sample)

)

# 加法,預設加1

# 加一成功返回true,溢位返回false

defadd

(arry,num=1)

:if arry[0]

>1:

return

false

length =

len(arry)-1

for i in arange(num)

: arry[length]+=1

while arry[length]

>

1and length>0:

while arry[length]

>1:

arry[length-1]

+=1arry[length]-=2

length-=

1return arry[length]

<=

1# 減法,其實用不到,預設減1

# 減一成功返回true,溢位返回false

defsub

(arry,num=1)

:if arry[0]

<0:

return

false

length =

len(arry)-1

for i in arange(num)

: arry[length]-=1

while arry[length]

<

0and length>0:

while arry[length]

<0:

arry[length-1]

-=1arry[length]+=2

length-=

1return arry[0]

>=

0

# arry 為集合

# book 為標記陣列

# num 為選擇多少個,預設為選擇所有

defselect

(arry,book,num=

none):

length =

len(book)

val =

if num!=

none

:sum=0

while

sum!=num:

ifnot add(book)

:return val

sum=0

for item in book:

sum+=item

for i in arange(length)

:if book[i]

>0:

)return val

sum=0

print

("all sub set:"

)for i in arange(

255)

: rs = select(sample,book,3)

iflen

(rs)

>0:

print

(rs)

print

("total:"

,sum

)

# 輸出..

.['a',

'c',

'h']

['a'

,'c'

,'g'][

'a',

'c',

'f']

['a'

,'c'

,'e'][

'a',

'c',

'd']

['a'

,'b'

,'h'][

'a',

'b',

'g']

['a'

,'b'

,'f'][

'a',

'b',

'e']

['a'

,'b'

,'d'][

'a',

'b',

'c']

total:

56

回溯演算法 組合問題

回溯搜尋法 純暴力搜尋,不是一種高效的演算法。但因為有些問題能夠通過回溯法解決已經很棒了,回溯法比那種通過多層迴圈的效率還是要高很多的。回溯法均可抽象為乙個n叉樹形結構,這個樹的寬度是這個集合所有的元素,深度為遞迴的深度。如下圖 回溯三步曲 1.遞迴函式引數和返回值 2.確定終止條件 3.單層遞迴邏...

某基礎的組合問題

城市a b間有規整的n m的方格網路,且a b分別為網路的左下角和右上角,現有一車從a到b,且只能向右或向上移動,求有多少條可能的移動路徑?答案對p取模。對於20 的資料,n,m 5 對於50 的資料,n,m 103 對於70 的資料,n,m 106 p為質 數 對於100 的資料,n,m 106 ...

演算法 排列組合問題

從m個數裡面選n個 m n 全部用到 棧的儲存結構 遞迴方法 用棧儲存選取的那n個數,選取就push,換乙個就pop再push 遞迴方法 要選取n個數,已經選取了k個,k n時表示一種組合結果完成 選擇乙個再之後遞迴 k 1 這是最簡單的問題,選擇n個數,每個數有m個選擇 每次選擇時只需要迴圈這m個...