1. 程式人生 > >資源排程(遞迴)

資源排程(遞迴)

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;     } }