week3 作業A題 選數問題 遞迴

2021-10-03 15:40:37 字數 1625 閱讀 9425

這題用遞迴的方法解決,每次都有兩個分支,乙個是選擇這個數,乙個是不選這個數,然後進入下一層,對下乙個數進行判斷,同時在每一步的過程中判斷已選擇的數個數和當前的選擇的數的和,來進行剪枝。

先是寫了乙個結構體list,有push_back,pop_back,size幾個方法

class

list

void

push_back

(int ele)

//從末尾插入

void

pop_back()

//將末尾元素彈出

intsize()

//返回

};

然後是關鍵的遞迴函式func:

這是邊界條件,數字個數為k並且 和為目標時說明方法+1

if

(li.

size()

==k&&sum==0)

適當的剪枝

if

(num>n)

return;if

(li.

size()

>=k||sum<0)

return

;

遞迴

li.

push_back

(a[num-1]

);//選擇該數,將數字壓入list的最後

func

(num+

1,sum-a[num-1]

,li,a)

; li.

pop_back()

;//回溯,將之前壓入的數字彈出

func

(num+

1,sum,li,a)

;//不選擇該數

以下是完整**:

#include

using

namespace std;

int count;

int n,k,s;

class

list

void

push_back

(int ele)

void

pop_back()

intsize()

};void

func

(int num,

int sum,list& li,

int* a)

if(num>n)

return;if

(li.

size()

>=k||sum<0)

return;

li.push_back

(a[num-1]

);func

(num+

1,sum-a[num-1]

,li,a)

;//選

li.pop_back()

;func

(num+

1,sum,li,a)

;//不選

}int

main()

count=0;

list li;

func(1

,s,li,a)

; cout<'\n';}

}

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 選數 dfs剪枝

有n個數,從中選取k個,要求和為s,計算有多少種選數的方法。其中,k n 16。dfs遞迴求解,n個數存放在陣列a內,遞迴函式的引數為sum i,表示從a i 向後選數,和為sum,選出的數放進全域性變數vector容器v內。當v中元素數為k並且sum 0時,找到一種符合條件的選數方法 當i n或者...

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

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