NOIP2012 普及组 T3 摆花——S.B.S.
2016-05-06 13:36
176 查看
题目描述
小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆。通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号。为了在门口展出更多种花,规定第i种花不能超过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 普及组 第三题
———————————————————我是分割线——————————————————————————————
一道DP水题
可以这样想:当考虑(第x种花,共选完y朵)的状态时,结果可以从 【当前这种花选i朵(i<=ai)】+(考虑第x-1种花,共选完y-i朵)这样的方案数得出,而得出的方法就是简单地数值累加。
因此,我们就能类似想到 有限背包的dp算法——从后往前计算;
这种算法的最原始版就是直接三重循环实现
加上空间优化到一维后(优化方法同有限背包优化),解决这题的数据范围就绰绰有余了
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; class su { private: int s[101],d[101][101]; int n,m; public: su() { n=0;m=0; memset(s,0,sizeof(s)); memset(s,0,sizeof(d)); } void input() { int i; cin>>n>>m; for(i=1;i<=n;i++) cin>>s[i]; for(i=0;i<=n;i++) d[i][0]=1; put(); } void put() { int i,j,k,t; for(i=1;i<=n;i++) for(j=1;j<=m;j++) { t=j; if(s[i]<j) t=s[i]; for(k=0;k<=t;k++) d[i][j]=(d[i][j]+d[i-1][j-k])%1000007; } } ~su() { cout<<d [m]<<endl; } }; int main() { std::ios::sync_with_stdio(false); su ss; ss.input(); return 0; }
View Code
相关文章推荐
- java.lang.String.indexOf()方法
- MySQL Connector ODBC 安装出现 “找不到指定的模块xxx”
- wps操作记录
- Nginx负载均衡配置实例详解
- Java/Android引用类型及其使用分析
- rpmbuild的一个小常识
- Axis2学习笔记:用户身份认证
- Android 自定义控件实现刮刮卡效果 真的就只是刮刮卡么
- iOS的几种后台机制
- 串行异步网络请求的简单实现
- java中BlockingQueue 的使用
- Oracle数据库语法之【DML】常用汇总-【更新】
- 数组中局部最小数的位置
- Linux和win7(win10)双系统时间错误问题 时间相差8小时
- ABP源码分析四十四:ZERO的配置
- MySql UDF 调用外部程序和系统命令
- listview gridview屏蔽滑动及嵌套时解决方法
- 托管项目到GitHub
- 在EntityFramework6中管理DbContext的正确方式——4DbContextScope:一个简单的,正确的并且灵活的管理DbContext实例的方式(外文翻译)
- 在EntityFramework6中管理DbContext的正确方式——3环境上下文DbContext vs 显式DbContext vs 注入DbContext(外文翻译)