划分硬盘分区

题目描述

小H花10000元买了一台超低配置的电脑,然而电脑上连分区都没划分,于是,小H准备开始依据《操作员手册》第三篇《电脑配置(10000元机器)》划分分区。

这本书说:这台机器需要被划分成n个分区,其中可以有分区是空的(这并不完全等于没划分)。

因为电脑的奇奇怪怪的问题,所以第i个分区的大小只能是0和a[i]之间的整数

这台电脑的内存为m(n个分区的大小的和为m),小H想知道有多少种划分方案。

结果对1000007取模。

输入

n m

a[i]..a[n]

输出

方案数 mod 1000007

样例输入

2 4
3 2

样例输出

2

提示


方案1:第一个盘大小为2,第二个盘大小为2



方案2:第一个盘大小为3,第二个盘大小为1



0



0<=a[i]<=100

/*记忆化搜索*/


附AC码:

#include
#include
#include
#include
#include
#include
using namespace std;
int s[128],a[128][128];
int dfs(int x,int y){
    if(x==0 && y>0)
        return 0;
    if(x==0) return 1;
    if(a[x][y])return a[x][y];
    int k=min(s[x],y);
    for(int i=0;i<=k;i++){
        a[x][y]+=dfs(x-1,y-i);
        a[x][y]%=1000007;
    }return a[x][y];
}
int main(){
    int i,j,k,m,n;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        scanf("%d",&s[i]);
    printf("%d\n",dfs(n,m));
    return 0;
}



你可能感兴趣的:(题目,数据结构(常用算法),搜索,DFS)