week3 選數問題

2021-10-04 02:27:49 字數 1603 閱讀 4010

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 first line, three integers indicate nn, kk and ss. the second line, nn integers indicate the positive numbers.

output:for each case, an integer indicate the answer in a independent line.

樣例:

input:

110 3 10

1 2 3 4 5 6 7 8 9 10

output:

4分析:

if

(sum為0並且number為k,即選了k個數,且和為s)

//繼續選

if(index>n-1)

//即最後乙個數都已經選擇過了

return;if

(number>k||sum<0)

//選的數個數不符合要求或和超過s

return

;

不選擇a[index]

那麼index++(去判斷下乙個數),sum不變,number不變

選擇 a[index]

那麼index++

(去判斷下乙個數)

,sum=sum-a[index]

,number++

總結:注意返回的條件,當和為s且選的數個數為k,成功,返回。當下標已不在這n個數里,或選的數個數不符合要求,或選擇的數的和已經超過s,失敗,返回。

#include

using

namespace std;

#define range 16

int test =

0, n =

0, k =

0, s =

0, way=0;

int a[range]

;void

func

(int index,

int sum,

int number=0)

if(index > n-1)

return

;//邊界

if(number > k || sum <0)

return

;//沒有必要繼續

func

(index +

1, sum, number)

;//不選

func

(index +

1, sum - a[index]

, number+1)

;//選

}int

main()

return0;

}

week3 作業A題 選數問題 遞迴

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

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對每一組資料輸出...