演算法訓練 和為T(Dfs)

2021-10-03 21:31:24 字數 1521 閱讀 1936

資源限制

時間限制:1.0s 記憶體限制:256.0mb

問題描述

從乙個大小為n的整數集中選取一些元素,使得它們的和等於給定的值t。每個元素限選一次,不能乙個都不選。

輸入格式

第一行乙個正整數n,表示整數集內元素的個數。

第二行n個整數,用空格隔開。

第三行乙個整數t,表示要達到的和。

輸出格式

輸出有若干行,每行輸出一組解,即所選取的數字,按照輸入中的順序排列。

若有多組解,優先輸出不包含第n個整數的;若都包含或都不包含,優先輸出不包含第n-1個整數的,依次類推。

最後一行輸出總方案數。

樣例輸入

5-7 -3 -2 5 9

0樣例輸出

-3 -2 5

-7 -2 9

2資料規模和約定

1<=n<=22

t<=maxlongint

集合中任意元素的和都不超過long的範圍

題解

我們可以用遞迴去取元素,每個元素可以取或者不取,所以這個遞迴就像二叉樹一樣分叉下去。

注意:若有多組解,優先輸出不包含第n個整數的;若都包含或都不包含,優先輸出不包含第n-1個整數的,依次類推。這個要怎麼解決呢,可以考慮遞迴的時候先遞迴元素不取的情況,再遞迴取該元素的情況,這樣得到答案的順序就滿足了題目要求。

還有乙個坑點是:每個元素限選一次,不能乙個都不選。如果題目要求得到 0,我們不能乙個元素都不選,如果忽略了,那麼得到的解會比答案多一。(有兩個測試用例卡的是這個點)

#include

#include

using

namespace std;

long

long n,res;

int cnt=0;

bool vis[30]

;long

long num[30]

;void

pprint()

void

dfs(

int le,

int sum)

if(code==0)

//乙個都不選的情況

return;}

if(sum==res)

pprint()

;return;}

dfs(le-

1,sum)

; vis[le]

=true

;dfs

(le-

1,sum+num[le]);

vis[le]

=false

;//回溯

}int

main()

演算法訓練 和為T

問題描述 從乙個大小為n的整數集中選取一些元素,使得它們的和等於給定的值t。每個元素限選一次,不能乙個都不選。輸入格式 第一行乙個正整數n,表示整數集內元素的個數。第二行n個整數,用空格隔開。第三行乙個整數t,表示要達到的和。輸出格式 輸出有若干行,每行輸出一組解,即所選取的數字,按照輸入中的順序排...

演算法訓練 和為T

問題描述 從乙個大小為n的整數集中選取一些元素,使得它們的和等於給定的值t。每個元素限選一次,不能乙個都不選。輸入格式 第一行乙個正整數n,表示整數集內元素的個數。第二行n個整數,用空格隔開。第三行乙個整數t,表示要達到的和。輸出格式 輸出有若干行,每行輸出一組解,即所選取的數字,按照輸入中的順序排...

演算法訓練 和為T

題目鏈結 問題描述 從乙個大小為n的整數集中選取一些元素,使得它們的和等於給定的值t。每個元素限選一次,不能乙個都不選。include using namespace std long long a 25 select 22 cnt,res,n void solve int cur,long lon...