子集和問題就是 給出乙個陣列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...