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個...