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

2021-10-03 23:17:44 字數 1205 閱讀 8552

題意:

一開始給定乙個數,即為資料的組數。每組資料有兩行,其中第一行三個數,分別為該組資料的個數,要選擇的資料的個數和要選擇的資料的和,第二行即為一組資料。要求在這組資料中,選擇給定個數的資料,且這幾個資料的和為給定要求的和,求這樣的解的個數。(具體題目截圖貼在最後面)。

思路:利用遞迴搜尋的方法,對陣列中的每個數有選擇和不選擇兩種可能性。不妨設給定的和為sum,給定的資料個數為k。在遞迴中,將sum和k的值作為引數進行傳遞。當選則這個數的時候,即有sum-a[i]和k-1帶入下一輪遞迴中;若沒選擇這個數的時候,即將sum和k直接帶入下一輪迴圈中。當sum0且k0的時候,即找到一組解,記錄數加一。在遞迴中,注意若sum和k的值已經為負數的時候,即已經不符合題意,即遞迴結束,並且當i的值若大於陣列元素的個數的時候,該輪遞迴也結束。

總結:主要利用的遞迴求解的方法,在遞迴中注意選擇和不選擇的時候,帶入下一輪的時候的引數的改變情況。同時注意剪枝的使用,另外覺得用sum和k,從開始然後依次遞減的方法挺好用。

**:

#include

using

namespace std;

int count=0;

// 陣列 選的個數 和 陣列個數 當前的元素位置

void

dfs(

int*num,

int k,

int sum,

int a,

int i)

if(i>=a)

return;if

(k<

0|| sum<0)

return

;dfs

(num, k, sum, a, i+1)

;//當前的不選

dfs(num,k-

1,sum-num[i]

,a,i+1)

;//當前的選

}int

main()

dfs(num,b,sum,a,0)

; cout<

delete

num;

}return

0;}

具體題目:

程式設計思維與實踐 Week3 作業

b 區間選點 貪心 c 區間覆蓋問題 貪心 給出n個正數,從其中選出k個數,使其總和為s,問 有多少種選數方案?input 第一行是正數t t 100 表示測試的組數。每一組都輸入兩行,第一行是三個整數n,k,s,第二行是n個正整數。output 每一組輸出結果佔一行,為方案的數目。sample i...

程式設計思維與實踐 Week3 作業

給定n個正數,從中選出k個數,令其和為s,求選數的方案數。對於每乙個數選擇與不選擇都進行dfs 邊界條件 選中k個數且和為s 選中數的個數大於k 選中數的和大於s 要選的數越界了 include using namespace std int ans 0 int a 2000 int n,k,s v...

程式設計思維與實踐 week3

題目 題意 給定n個正整數,要求選出k個數,使選出來的k個數和為sum,共有多少個方案?輸入 第一行乙個數t t 100 表示有t組測試資料。接下來的兩行,一行有三個數n,k,s,一行有n個正整數。輸出 每組資料輸出乙個和為s的方案個數,每組佔一行。思路 dfs 可行性剪枝 子集列舉問題。列舉所有子...