题目:http://poj.org/problem?id=3046

就是多重集组合数(分组背包优化);

从式子角度考虑:(干脆看这篇博客) https://blog.csdn.net/viphong/article/details/48110525

从意义的角度来考虑:

当 j<=a[i] 时,f[i][j] = f[i-1][j]  + f[i][j-1],就是分成了不选第 i 种物品和至少选一个第 i 种物品的情况,其中 f[i][j-1] 代表 j-1 后剩下的那一个物品一定是第 i 种;

当 j>a[i] 时,f[i][j] = f[i-1][j] + f[i][j-1] - f[i-1][j-1-a[i]],因为此时 j-1 后第 i 种物品可能仍然已经被选满( j - 1 >= a[i] ),无法再至少来一个 i 物品,所以减去 j-1 后 i 被选满的情况。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int const maxn=1e5+,mod=1e6;
int n,m,st,ed,f[][maxn],a[],ans;
int main()
{
scanf("%d%d%d%d",&n,&m,&st,&ed);
for(int i=,x;i<=m;i++)
scanf("%d",&x),a[x]++;
f[][]=;f[][]=;
for(int i=;i<=n;i++)
for(int j=;j<=ed;j++)
{
if(j<=a[i])f[i%][j]=(f[i%][j-]+f[(i+)%][j])%mod;
else f[i%][j]=(f[i%][j-]+f[(i+)%][j]-f[(i+)%][j--a[i]]+mod)%mod;//+mod
}
for(int j=st;j<=ed;j++)
(ans+=f[n%][j])%=mod;
printf("%d\n",ans);
return ;
}

最新文章

  1. wkwebview 代理介绍
  2. Flex条件判断中注意事项
  3. 简单poi读取excel
  4. svn IP地址变更后如何变更
  5. spring-quartz普通任务与可传参任务
  6. CADisplayLink的简单使用
  7. cocos2d-x ios 设置横屏/竖屏(全)
  8. 【Vue.js】加载更多—vue-infinite-scroll
  9. WIFI的AP/Sta模式简单介绍
  10. 点击button会自动刷新页面
  11. 【PAT】B1085 PAT单位排行(25 分)(c++实现)
  12. maven依赖有一个步长原则 如果a 对 b和c都有依赖 如果b的步长近则使用b的
  13. yii2 rules验证规则,ajax验证手机号码是否唯一
  14. springboot aop 自定义注解方式实现一套完善的日志记录(完整源码)
  15. H5视频播放器属性与API控件,以及对程序的解释
  16. Android Hawk数据库 github开源项目
  17. 前端canvas合并图片两种实现方式
  18. org.json.JSONObject and no properties discovered 错误解决
  19. 数据库 Navicat_Premium_11.0.10 破解版下载安装
  20. soapui使用。简单测试+测试套+负载测试。

热门文章

  1. 【思维】2017多校训练七 HDU6121 Build a tree
  2. PHP中的字符串替换(str_replace)
  3. 在RedHat 5下安装Oracle 10g详解(转)
  4. OC-category 为什么不能添加成员变量
  5. iOS 混合变换旋转 CGAffineTransform 的使用
  6. HDU 6333 莫队+组合数
  7. P1427 小鱼的数字游戏 洛谷
  8. python 爬虫(转,我使用的python3)
  9. git获取远程分支
  10. cppcon