soj 3531 Number Pyramids(观察组合数 + 每种物品至少选一个的完全背包)
来源:互联网 发布:c语言输入函数 编辑:程序博客网 时间:2024/06/05 19:46
题意
给你一个类似杨辉三角的堆积法,问在给定顶端的数和,底部长度的情况下,一共有多少种堆积方式?
分析
这个拿到找了半天分解子问题,记忆化搜索都没有办法…最后才发现了最底部的数,会被扩大,然后传递到顶部去,然后观察这个扩大倍数或发现恰恰是组合数!
假设最底部的数是:
然后就把这些组合数当做物品,他们的系数
然后这里比较特殊的是,每种物品都要至少选择一个,我们就先把背包总容量减去每个物品选一个所需要消耗的容量(
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <set>using namespace std;const int mod = 1e9 + 9, maxn = 1e6 +9;int n, m;int dp[maxn];int main(void) { while (~scanf("%d%d", &n, &m)) { if (n > 20) { puts("0"); continue; } int x = 1 << (n - 1), y = n - 1; if (x > m) { puts("0"); continue; } int c = 1; for (int i = 0; i <= y; i++) { m -= c; c = c * (y - i) / (i + 1); } fill(dp, dp + m + 9, 0); dp[0] = 1; for (int i = 0, c = 1; i <= y; i++) { for (int j = c; j <= m; j++) { dp[j] = (dp[j] + dp[j - c]) % mod; } c = c * (y - i) / (i + 1); } printf("%d\n", dp[m] % mod); } return 0;}
3 0
- soj 3531 Number Pyramids(观察组合数 + 每种物品至少选一个的完全背包)
- 第二讲 完全背包问题——第二个基本的背包问题模型,每种物品可以放无限多次
- 第三讲 多重背包问题——每种物品有一个固定的次数上限。
- SOJ 3531_Number Pyramids
- 给定N中物品和一个背包。物品i的重量是Wi,其价值位Vi ,背包的容量为C。问应该如何选择装入背包的物品,使得转入背包的物品的总价值为最大?对每种物品i只有两种选择,即装入背包和不装入背包
- hdu3033 I love sneakers! (背包问题变形 每种至少买一个)
- 多重背包 (n种物品,每种m个)
- soj 3300 Stockholm Coins(完全背包的更新次数)
- 分组背包hdu 3033 至少选一个
- 完全背包基础详解(附求解选择的物品)
- uvaoj 10465 - Homer Simpson 物品无限的完全背包
- soj - 1701 - Cannonball Pyramids
- SOJ.Cannonball Pyramids
- 完全背包问题 打印背包中的物品
- 背包问题——“完全背包”详解及实现(包含背包具体物品的求解)
- 背包问题——“完全背包”详解及实现(包含背包具体物品的求解)
- 背包问题——“完全背包”详解及实现(包含背包具体物品的求解)
- 背包问题——“完全背包”详解及实现(包含背包具体物品的求解)
- 如何禁止类的拷贝构造函数和复制构造函数
- PHP中上传多张图片
- 细说集中式与分布式版本控制系统
- 物联网探秘:那些来自传感器的数据都是如何上传至云端的?
- fork/join框架简介
- soj 3531 Number Pyramids(观察组合数 + 每种物品至少选一个的完全背包)
- 李彦宏:百度之前招人有点猛 现在想消化一下 百度市值猛涨到600亿美元 祝贺
- SQL数据库基本操作语句
- WIN32API实现的2048无尽版小游戏
- 人的需求
- scst cache 代码调试笔记
- 【软考点点】知识产权
- [Unity3D学习] Unity代码热更新 源码下载
- java 接口回调