描述:s=是乙個正整數的集合,c是乙個正整數。計算s的乙個子集s1,使得子集s1的所有元素之和等於c。利用回溯法解決該問題。依次輸入:s的大小,整數c,集合s中的元素輸出:子集s1.如果無解,輸出「no solution」
#include
using
namespace std;
int s[
100]
;//集合
int s1[
100]
;//解集(0/1)
int s2[
100]
;int n;
//數目
int c;
//目標加和
int cw;
//當前加和
int r;
int best;
bool flag;
void
backtrack
(int i)
best = cw;
return;}
if(cw + s[i]
<= c)
r -= s[i];if
(cw + r > best)
r += s[i];}
intmain()
cin >> c;
cw =0;
best =0;
flag =
true
;backtrack(1
);if(flag ==
true
) cout <<
"no solution"
<< endl;
else
}
#include
using
namespace std;
int s[
100]
;//集合
int s1[
100]
;//解集(0/1)
int n;
//數目
int c;
//目標加和
int cw;
//當前加和
int r;
int best;
bool flag;
void
backtrack
(int i)
best = cw;
return;}
if(cw + s[i]
<= c)
r -= s[i];if
(cw + r > best)
r += s[i];}
intmain()
cin >> c;
cw =0;
best =0;
flag =
true
;backtrack(1
);if(flag ==
true
) cout <<
"no solution"
<< endl;
}
回溯法 子集和問題
問題 給定n個正整數wi和乙個正整數m,在這n個正整數中找出乙個子集,使得子集中的正整數之和等於m。解的形式 設定乙個n元組 x0,x1,xn 1 如果wi包含在這個子集中,xi就等於1,反之等於0.boundfunction 演算法偽 package com.iteye.caoruntao.sum...
演算法 子集和問題
子集和問題就是 給出乙個陣列arr和乙個值sum 輸出滿足和為sum的arr的子集 子集和問題 從某種程度上來說 其實就是 01揹包問題的 子問題 還是取一種情況 不取是另外一種情況 然後 用回溯法 構建出一棵樹來遍歷一下 include include using namespace std co...
回溯演算法 子集樹 0 1揹包問題
0 1揹包 即每種物品只有2 種選擇,分別為 裝入揹包或不裝入揹包,物品數和揹包容量已給定,計算裝入揹包物品的最大價值和最優裝入方案,用回溯法搜尋子集樹的演算法進行求解。對此模型我們剛好建立二叉樹 此處為完全二叉樹 對應的葉子節點數為 n n為頂點數 解子集樹 約束函式 cw w i x i c。c...