子集和問題 基於dfs的回溯思想

2021-10-11 12:29:13 字數 1051 閱讀 3053

子集和問題

description

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

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

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

。input

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

output

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

sample

input

5 10

2 2 6 5 4

output

2 2 6

hint

#include

using namespace std;

int a[

100010];

int pre[

100010];

int vis[

100010];

int tot =0;

int f =0;

int n,c;

void

dfs(

int p,

int q)

else

if(vis[i]

)cout<<

" "

if(tot+pre[n]

-pre[p]

return

;//已經沒必要繼續

//go

if(totdfs(p+

1,n)

;//back

tot-

=a[p]

; vis[p]=0

;dfs

(p+1

,n);

}int

main()

if(pre[n]

dfs(

1,n)

;}

子集和問題 回溯

子集和問題的乙個例項為 s,t 其中,s 是乙個正整數的集合,c是乙個正整數。子集和問題判定是否存在s的乙個子集s1,使得 sum s1 c。試設計乙個解子集和問題的回溯法。對於給定的正整數的集合s 和正整數c,計算s 的乙個子集s1,使得 sum s1 c。輸入資料的第1 行有2 個正整數n 和c...

子集和問題(dfs)

題目資訊 問題描述 對於乙個給定正整數的集合s 和正整數c,程式設計計算s的乙個子集s1,使得子集s1的和等於c。輸入格式 第一行有2個正整數n和c,第二行有n個正整數 輸出格式 一行資料,按輸入的順序輸出,若無解則輸出 no solution 輸入樣例 5 10 2 2 6 5 4 輸出樣例 2 ...

回溯法 子集和問題

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