演算法 子集和問題

2021-10-04 23:29:00 字數 1677 閱讀 5832

子集和問題就是 給出乙個陣列arr和乙個值sum  輸出滿足和為sum的arr的子集

子集和問題 從某種程度上來說 其實就是 01揹包問題的 子問題 還是取一種情況 不取是另外一種情況 然後 用回溯法 構建出一棵樹來遍歷一下

#include

#include

using

namespace std;

const

int n =

1000

;int arr[n]

;// 儲存幾何元素

bool vis[n]

;// 儲存集合狀態

int valsum;

//當前和

void

slove

(int i ,

int n ,

int m)

// 取數

vis[i]

=true

; valsum +

= arr[i]

;//滿足 輸出

if(valsum == m)

}printf

("}\n");

}else

if(valsum < m)

//回溯

vis[i]

=false

; valsum -

= arr[i]

;slove

(i+1

,n,m)

;return;}

intmain

(int argc,

char

const

*ar**)

slove(0

,num,sum)

;return0;

}

子集和數問題

已知(w1, w2, …, wn)和m,均為正數。要求找出wi的和數等於m的所有子集。

例如:若n=4,(w1,w2,w3,w4)=(11,13,24,7),m=31,則滿足要求的子集是(11,13,7)和(24,7).

子集和數問題解的一種表示方法

//找w(1:n)中和數為m的所有子集。進入此過程時x(1),…,x(k-1)的值已確定。w(j)按非降次序排列。

global integer m,n; global real w(1:n); global boolean x(1:n)

real  r,s; integer k,j

//生成左兒子//

x(k)←1

if s+w(k)=m then

print(x(j),j←1 to k)

else

if s+w(k)+w(k+1)<=m then

call sumofsub(s+w(k),k+1,r-w(k))

endif

endif

//生成右兒子和計算bk的值//

(當前和,當前處理的子數,剩餘子數的和)

回溯法 子集和問題

問題 給定n個正整數wi和乙個正整數m,在這n個正整數中找出乙個子集,使得子集中的正整數之和等於m。解的形式 設定乙個n元組 x0,x1,xn 1 如果wi包含在這個子集中,xi就等於1,反之等於0.boundfunction 演算法偽 package com.iteye.caoruntao.sum...

swift演算法 子集

1 描述 給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集 例 輸入 nums 1,2,3 輸出 3 1 2 1,2,3 1,3 2,3 1,2 2 演算法 1 二進位制位 思想 集合的每個元素,都有可以選或不選,用二進位制和位運算,可以很好的表...

探索 中級演算法 子集

這裡題目沒有要求子集內的元素必須公升序,也沒有要求所有子集的排列順序,且沒有重複的元素。參考自 解法一 迭代 對於題目中給的例子 1,2,3 來說,最開始是空集,那麼我們現在要處理1,就在空集上加1,為 1 現在 有兩個自己和 1 下面來處理2,我們在之前的子集基礎上,每個都加個2,可以分別得到 2...