回溯法 子集和問題(兩種)

2021-10-06 02:50:57 字數 1490 閱讀 7449

描述: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...