子集和問題 回溯

2022-07-09 12:30:12 字數 876 閱讀 5228

子集和問題的乙個例項為〈s,t〉。其中,s=是乙個正整數的集合,c是乙個正整數。子集和問題判定是否存在s的乙個子集s1,使得:sum(s1) = c

試設計乙個解子集和問題的回溯法。

對於給定的正整數的集合s=和正整數c,計算s 的乙個子集s1,使得:sum(s1)=c。

輸入資料的第1 行有2 個正整數n 和c(n≤10000,c≤10000000),n 表示s 的大小,c是子集和的目標值。接下來的1 行中,有n個正整數,表示集合s中的元素。

將子集和問題的解輸出。當問題無解時,輸出「no solution!」。

5 10

2 2 6 5 4

2 2 6
時間複雜度為o(n!)可通過加限制條件達到剪枝效果

#include using namespace std;

int n=0,c=0;

int d[10050];

int t[10050];

int l=0;

int flag = 0;

int mysum = 0;

void backtrack(int,int,int);

int main()

//回溯呼叫

for (int i = 1; i <= n; ++i)

//輸出

if (flag == 0)

else

cout<}

}void backtrack(int x,int s1,int s2)

for (int i = s1; i <= s2; ++i)

}

回溯法 子集和問題

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

子集和問題(回溯法)

第五章5 1 子集和問題 實驗報告 一 問題分析 處理的物件 給定的集合元素的個數和集合以及要湊成的和 要實現的功能 對於給定的集合,計算出它的乙個子集,使得子集內元素的和等於給出的正整數。這乙個子集就是最先計算出的那個子集 演算法思想 當我們給出集合個數n和要湊成的和m以及n個集合元素,我們使用乙...

子集和問題(回溯法)

給定乙個含有n個元素的整形陣列a,再給定乙個和sum,求出陣列中滿足給定和的所有元素組合,舉個例子,設有陣列a 6 sum 10,則滿足和為10的所有組合是 注意,這是個n選m的問題,並不是兩兩組合問題 最直觀的想法就是窮舉,把陣列中元素的所有組合情況都找出來,然後看看哪些組合滿足給定的和即可,這種...