划分硬盘分区

来源:互联网 发布:做淘宝代销什么好 编辑:程序博客网 时间:2024/05/14 12:49

题目描述

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

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

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

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

结果对1000007取模。

输入

n m

a[i]..a[n]

输出

方案数 mod 1000007

样例输入

2 43 2

样例输出

2

提示


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



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



0<n,m<=100



0<=a[i]<=100

/*记忆化搜索*/


附AC码:

#include<iostream>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>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;}



0 0
原创粉丝点击