這題用遞迴的方法解決,每次都有兩個分支,乙個是選擇這個數,乙個是不選這個數,然後進入下一層,對下乙個數進行判斷,同時在每一步的過程中判斷已選擇的數個數和當前的選擇的數的和,來進行剪枝。
先是寫了乙個結構體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對每一組資料輸出...