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