題意:
一開始給定乙個數,即為資料的組數。每組資料有兩行,其中第一行三個數,分別為該組資料的個數,要選擇的資料的個數和要選擇的資料的和,第二行即為一組資料。要求在這組資料中,選擇給定個數的資料,且這幾個資料的和為給定要求的和,求這樣的解的個數。(具體題目截圖貼在最後面)。
思路:利用遞迴搜尋的方法,對陣列中的每個數有選擇和不選擇兩種可能性。不妨設給定的和為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 可行性剪枝 子集列舉問題。列舉所有子...