子集和問題的乙個例項為〈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的問題,並不是兩兩組合問題 最直觀的想法就是窮舉,把陣列中元素的所有組合情況都找出來,然後看看哪些組合滿足給定的和即可,這種...