資源排程(遞迴)
1602: 物資排程
時間限制: 1 Sec 記憶體限制: 128 MB 提交: 24 解決: 18 [提交] [狀態] [命題人:外部匯入]
題目描述
某地區發生了地震,災區已經非常困難,災民急需一些帳篷、衣物、食品和血漿等物資。可通往災區的道路到處都是塌方,70%以上的路面損壞,橋樑全部被毀。國家立即啟動應急預案,展開史上最大強度的非作戰式的空執行動,準備向災區投放急需物資。 一方有難,八方支援。現在已知有N個地方分別有A1,A2,….,An個物資可供調配。目前災區需要物資數量為M。 現在,請你幫忙算一算,總共有多少種物質排程方案。假設某地方一旦被選擇調配,則其物資數全部運走。
輸入
第一行:K 表示有K組測試資料。 接下來對每組測試資料有2行,第1行: N M 第2行:A1 A2 …… An
輸出
對於每組測試資料,輸出一行:物資排程的總方案數。
樣例輸入
2 4 4 1 1 2 2 4 6 1 1 2 2
樣例輸出
3 1
提示
2≤K≤8,1<N≤100,1<M≤1000,1≤ Ai≤1000 所有資料都是正整數,輸入資料之間有一個空格,假設給定的資料至少有一種排程方案。
AC程式碼(遞迴版)
#include<stdio.h> #include<string.h> int a[110],book[110],x,m,n; int str(int sum,int i) { if(sum==m) { x++; return x; } for(int j=i;j<=n;j++) { if(book[j]==0) { if(sum+a[j]>m) continue; else if(sum+a[j]<=m) { book[j]=1; str(sum+a[j],j); } book[j]=0; } } } int main() { int t,i,j,s=0; scanf("%d",&t); while(t--) { s=0; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { scanf("%d",&a[i]); } str(0,1); printf("%d\n",x); memset(book,0,sizeof(book)); x=0; } }