博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态规划:多重集组合数
阅读量:5119 次
发布时间:2019-06-13

本文共 1099 字,大约阅读时间需要 3 分钟。

有n种物品, 第i种物品有a个. 不同种类的物品可以互相区分, 但相同种类的无法区分

从这些物品中取出m个, 有多少种取法

求多重集组合数,并没有让枚举多重集组合

可是枚举应该怎么枚举呢?哈希判重?

dp[i][j] 表示前i种物品,一共拿了j个物品的方法数

为了得到dp[i][j],那么可以从前i-1种物品取j-k个,再从第i种物品取k个即可

这个公式是O(n(m^2))的

优化一下效率

决策:第i种不选或者至少选一个

dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-ant[i]-1]

然后给出实现,这里的答案把m的值从S到B都累加了

1 #include
2 using namespace std; 3 const int maxn=100005; 4 const int MOD=1000000; 5 int T,A,S,B,ans; 6 int a[1005]; //一共这么多种,存每种几个 7 int f[2][maxn]; 8 int main() 9 {10 int x;11 scanf("%d%d%d%d",&T,&A,&S,&B);12 for(int i=1;i<=A;i++)13 {14 scanf("%d",&x);15 a[x]++;16 } 17 f[0][0]=f[1][0]=1;18 for(int i=1;i<=T;i++) //一共几种数19 for(int j=1;j<=B;j++) //Cn取m的那个m20 if(j-a[i]-1>=0)21 f[i%2][j]=(f[(i-1)%2][j]+f[i%2][j-1]-f[(i-1)%2][j-a[i]-1]+MOD)%MOD;22 else f[i%2][j]=(f[(i-1)%2][j]+f[i%2][j-1])%MOD;23 for(int i=S;i<=B;i++)24 ans=(ans+f[T%2][i])%MOD;25 printf("%d",ans);26 return 0;27 }

其实这个题给我印象最深的地方是%2,让我立刻想起了NOIP2014day1T3激扬的小鸟的满分做法

转载于:https://www.cnblogs.com/aininot260/p/9476508.html

你可能感兴趣的文章
Yii2 Lesson - 03 Forms in Yii
查看>>
Python IO模型
查看>>
Ugly Windows
查看>>
DataGridView的行的字体颜色变化
查看>>
Java再学习——关于ConcurrentHashMap
查看>>
如何处理Win10电脑黑屏后出现代码0xc0000225的错误?
查看>>
局域网内手机访问电脑网站注意几点
查看>>
[Serializable]的应用--注册码的生成,加密和验证
查看>>
Day19内容回顾
查看>>
第七次作业
查看>>
SpringBoot项目打包
查看>>
Linux操作系统 和 Windows操作系统 的区别
查看>>
《QQ欢乐斗地主》山寨版
查看>>
文件流的使用以及序列化和反序列化的方法使用
查看>>
Android-多线程AsyncTask
查看>>
第一个Spring冲刺周期团队进展报告
查看>>
红黑树 c++ 实现
查看>>
Android 获取网络链接类型
查看>>
linux中启动与终止lnmp的脚本
查看>>
gdb中信号的处理[转]
查看>>