Week3 作業A 選數 dfs剪枝

2021-10-04 01:54:31 字數 747 閱讀 2479

有n個數,從中選取k個,要求和為s,計算有多少種選數的方法。其中, k<=n<=16。

dfs遞迴求解,n個數存放在陣列a內,遞迴函式的引數為sum、i,表示從a[i]向後選數,和為sum,選出的數放進全域性變數vector容器v內。當v中元素數為k並且sum=0時,找到一種符合條件的選數方法;當i>=n或者v中元素數》k或者sum<0時,該選數方法已經不成立,不必繼續下去,遞迴結束(可行性剪枝)。否則,分選a[i]和不選a[i]兩種轉移方式,若不選,sum不變,i+1繼續遞迴;若選,將a[i]加入vector,sum-=a[i],i+1繼續遞迴。

#include#include#includeusing namespace std;

int a[20];

int cnt;

int n,k,s; vectorv;

void select_num(int sum,int i)

//搜尋邊界

if(i>=n) return;

//可行性剪枝

if(v.size()>k || sum<0) return;

select_num(sum,i+1);//不選a[i]

v.push_back(a[i]);

select_num(sum-a[i],i+1);//選a[i]

v.pop_back();

}int main()

return 0;

}

week3 選數問題

title 有n個正整數,求出有多少種方式,使選取k個數,和為s。input the first line,an integer t 100t 100,indicates the number of test cases.for each case,there are two lines.the f...

week3 作業A題 選數問題 遞迴

這題用遞迴的方法解決,每次都有兩個分支,乙個是選擇這個數,乙個是不選這個數,然後進入下一層,對下乙個數進行判斷,同時在每一步的過程中判斷已選擇的數個數和當前的選擇的數的和,來進行剪枝。先是寫了乙個結構體list,有push back,pop back,size幾個方法 class list void...

程式設計思維與實踐 Week3 作業A 選數問題

輸出 思路 出現的錯誤 給定n個正整數,從中挑出k個,使得這k個數的和為s,程式設計求出有多少種取數方案。第一行給出乙個正整數t t 100 表明有t組資料。接下來,每一組資料佔兩行,第一行給出題意中所述三個數n,k,s 第二行給出n個正整數。1103 10123 4567 8910對每一組資料輸出...