1.揹包問題
設a = (a1
_11
,a2
_22
,…,an
_nn
)是由n個不同的正整數構成的n元組,s是另一已知的正整數。揹包問題就是從a中求出所有的 ai
_ii
,使其和等於s。其中a稱為揹包向量,s是揹包的容積。
從原則上講,如果揹包問題有解的話,通過檢查a的所有子集,總可以找到問題的解。然而如果a中元素個數n很大,子集個數2
n2^n
2n將非常大,尋找滿足要求的子集沒有比窮舉法更好的演算法,因此揹包問題是npc問題。
2.超遞增序列
由於揹包問題是npc問題,因此需引入一種特殊型別的揹包向量,使得揹包問題較容易去求解。
這裡將介紹超遞增序列,揹包向量a = (a1
_11
,a2
_22
,…,an
_nn
)稱為超遞增的,如果滿足aj
_jj
> ∑i=
0j−1
\sum_^
∑i=0j−
1ai
_ii
, j = 2,…,n。超遞增揹包向量對應的揹包問題很容易通過貪心演算法求解,即已知s為揹包容積,對a從右向左檢查每一元素,若s≥an,則an在解中;若s ∑i=
1n\sum_^
∑i=1n
ai
_ii
,(t,k)=1,即t在模k下有乘法逆元。設bi ≡ t* ai
_ii
mod k, i = 1,2,…,n,得到乙個新的揹包向量b = (b1,b2,…bn),使用者以b作為自己的公鑰。
3.揹包密碼體制
(1)金鑰生成
選擇乙個超遞增序列a = (a1
_11
,a2
_22
,…,an
_nn
),選擇隨機數m,滿足m> ∑i=
1n\sum_^
∑i=1n
ai
_ii
,再選擇隨機數u,滿足(u,m)=1且m > u,計算bi = uai mod m, 1≤i≤n,得到公鑰b = (b1,b2,…,bn),私鑰則為a,m,u。
(2)加密
明文m = (m1,m2,…,mn)是長度為n的位元串。使用公鑰b = (b1,b2,…,bn)計算密文:c = m1b1+m2b2+…+mnbn。
(3)解密
計算uu-1 ≡ 1 mod m,s = u-1c mod m,由s和超遞增序列a根據貪心演算法即可恢復明文m。
(4)示例
有超遞增序列a=(3,11,24,50,115),選取m=250,u=113,計算bi = uai mod m, 1≤i≤n,得到公鑰b = (89,243,212,150,245)。有明文序列m=(1,0,1,0,1),加密後有c=m1b1+m2b2+m3b3+m4b4+m5b5=546。
由uu-1 ≡ 1 mod m計算得u-1=177,s = u-1c mod m = 142,由s對a=(3,11,24,50,115)從右向左比對,142>115,則令x5=1,142-115=27<50,則x4=0,同理x3=1,x2=0,x1=1,因此得到明文m=(1,0,1,0,1)。
4.實現
揹包問題 python實現
根據自己的理解,用python寫了揹包問題的求解 問題描述 給定一組物品,每種物品都有自己的重量和 在限定的重量內,如何選擇才能使物品的總價最高?1.使用動態規劃的思想來解決揹包問題 解決思路 動態規劃,對每一件物品遍歷揹包容量,當揹包可容納值大於等於當前物品,與之前已放進去的物品所得價值進行對比,...
python揹包問題 揹包問題Python
題目 揹包容量ba 物品thing v 問題 1.是否可以裝滿揹包2.裝滿揹包最少需要多少件物品3.裝滿揹包最多需要多少件物品4.該揹包最多一共可以裝多重的物品5.裝滿揹包一共有多少種方案 就算物品重量一樣,但也是不同的方案 一 01揹包 def bag 01 bag v,thing v 是否可以裝...
python多重揹包 多重揹包
多重揹包問題 有 n 種物品和乙個容量是 v 的揹包。第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。資料範圍 0 n v 100 0 vi wi si 100 樸素版多重揹包問題 樸素版完全揹包問...