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