輸出:思路:
出現的錯誤:
**:給定n個正整數,從中挑出k個,使得這k個數的和為s,程式設計求出有多少種取數方案。
第一行給出乙個正整數t(t<=100),表明有t組資料。接下來,每一組資料佔兩行,第一行給出題意中所述三個數n,k,s;第二行給出n個正整數。
1103
10123
4567
8910
對每一組資料輸出乙個整數,表示方案個數,每組輸出佔一行。
4
該問題要從n個數選出k個,並使其和為s,對於每個數都有選與不選兩種情況,所以有2^n種情況,但列舉的複雜度過高,需對其中不合理的情況直接排除,如:和已經大於s,或者數的個數大於k。這些情況在選擇過程中就可以排除。因此,使用遞迴的方法,依次對n個數進行選與不選的判斷,對於遞迴過程中的不合理情況直接回到上一級,停止該遞迴支路,對於滿足條件的情況,則計數變數+1,同時返回上一級,直到選擇完所有資料。
在結束前一組資料的選擇後,未對儲存n個數的容器進行清空,使得前一組資料影響下一組資料導致出現錯誤。
#include
#include
using
namespace std;
int n,m,sum;
vector<
int> val;
int count=0;
void
select
(int i,
int thesum,vector<
int>
&arr)
if(i>=n||thesum<0)
return
;select
(i+1
,thesum,arr)
; arr.
push_back
(val[i]);
select
(i+1
,thesum-val[i]
,arr)
; arr.
pop_back()
;}intmain
(int argc,
char
** ar**)
select(0
,sum,arr);if
(i==0)
printf
("%d"
,count)
;else
printf
("\n%d"
,count);}
return0;
}
程式設計思維與實踐 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 可行性剪枝 子集列舉問題。列舉所有子...