洛谷 P1077 摆花 (dfs)

题目描述

小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆。通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号。为了在门口展出更多种花,规定第ii种花不能超过ai​盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列。

试编程计算,一共有多少种不同的摆花方案。

输入格式

第一行包含两个正整数n和m,中间用一个空格隔开。

第二行有n个整数,每两个整数之间用一个空格隔开,依次表示a1​,a2​,…,an​。

输出格式

一个整数,表示有多少种方案。注意:因为方案数可能很多,请输出方案数对1000007取模的结果。

输入输出样例

输入 #1
2 4
3 2
输出 #1
2

说明/提示

【数据范围】

对于20%数据,有0<n≤8,0<m≤8,0≤ai​≤8;

对于50%数据,有0<n≤20,0<m≤20,0≤ai​≤20;

对于100%数据,有0<n≤100,0<m≤100,0≤ai​≤100。

NOIP 2012 普及组 第三题

 

做一下记忆化搜索的笔记。

注意,不是每种花选至少1盆。可以不选。故在搜索的时候循环从0开始。

 

洛谷  P1077 摆花 (dfs)
#include<iostream>
#include<cstdio>
using namespace std;
const int mod=1000007;
int a,n[105],m;
int map[105][105];

int dfs(int st,int sum)
{
    int ans=0;
    if(sum>m) return 0;
    if(sum==m) return 1;
    if(st==a) return 0;
    if(map[st][sum]) return map[st][sum];
    for(int i=0;i<=n[st];i++)
        ans=(ans+dfs(st+1,sum+i))%mod;
    map[st][sum]=ans;
    return ans;
}
int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}
int main()
{
    a=read();
    m=read();
    for(int i=0;i<a;i++) n[i]=read();
    cout<<dfs(0,0);
    return 0;
}
dfs

 

上一篇:关系数据库编程之MySQL


下一篇:最长公共子序列LCS