此题已自我实现,但仍归于无码专区

本题在考场上就过了,所以难度并不高,发现性质即可。

problem

有 nnn 个正整数 a1,a2,...,ana_1,a_2,...,a_na1​,a2​,...,an​,他们的和为 mmm。你想对于其每一个子集 SSS,求出他们的和。

给定 2n2^n2n 个 [0,m][0,m][0,m] 之间的和,其中数字 iii 出现了 bib_ibi​ 次。

求还原 aaa,数据保证有唯一解。

n≤50,m≤10000,1s,128MBn\le 50,m\le 10000,1s,128MBn≤50,m≤10000,1s,128MB

my idea

首先就能知道 b0,bmb_0,b_mb0​,bm​ 一定是 111。

马上就发现最小的 aia_iai​ 是没有能被其他数组合出来的情况的,因为他们全是正数!

所以最小的 bi≠0b_i\neq 0bi​​=0 的 iii,就意味着 aaa 中原来有 bib_ibi​ 个 iii。

然后考虑第二小的 bj≠0b_j\neq 0bj​​=0 的 jjj,会注意到有可能 bib_ibi​ 个 iii 可能会组合出 jjj。

减去这些组合就是 aaa 中原本有 bj′b_j'bj′​ 个 jjj。

发现这就是个背包 dpdpdp 的过程。

容量 mmm,但最多只会背包 nnn 次。

所以跑得很快。

solution

与我的想法相同。

每次找到子集中最小的元素,也就是最小的 bib_ibi​ 不等于 000 的 iii,然后从背包里删去即可。

删除就是可以理解成逆向执行一下背包中加入元素 xxx 的操作,也就是从小到大,执行 bi−=bi−xb_i-=b_{i-x}bi​−=bi−x​。

code

#include <bits/stdc++.h>
using namespace std;
#define maxn 55
#define maxm 10005
#define int long long
int n, m, cnt;
int b[maxm], a[maxn], f[maxm];
int c[maxn][maxn];signed main() {freopen( "subset.in", "r", stdin );freopen( "subset.out", "w", stdout );scanf( "%lld %lld", &n, &m );for( int i = 0;i <= n;i ++ ) {c[i][0] = c[i][i] = 1;for( int j = 1;j < i;j ++ )c[i][j] = c[i - 1][j - 1] + c[i - 1][j];}for( int i = 0;i <= m;i ++ ) scanf( "%lld", &b[i] );f[0] = 1;for( int i = 1;i <= m;i ++ ) {b[i] -= f[i];if( ! b[i] ) continue;for( int j = 1;j <= b[i];j ++ ) a[++ cnt] = i;for( int j = m;j;j -- ) {for( int k = 1;k <= b[i];k ++ )if( j < k * i ) break;else f[j] += f[j - k * i] * c[b[i]][k];}}for( int i = 1;i <= n;i ++ ) printf( "%lld ", a[i] );return 0;
}

【无码专区12】子集和(背包dp)相关推荐

  1. 【无码专区9】序列统计(带权并查集 + 前缀和建边 + dp)

    因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...

  2. 【无码专区13】最小公倍数(线段树)

    因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 my idea顾名思义,记录了我的整个思维过程,以及自己部分实现细节口胡,还有期望分数 solution才是dls正解,但是因为只 ...

  3. 【无码专区11】异或2(结论 / 推式子 + 哈希hash + 大整数高精度 加减乘除重载考察)

    本题已自我实现.但仍归于无码专区 problem 求 ∑i=1n−1i⨁(n−i)\sum_{i=1}^{n-1}i\bigoplus (n-i)∑i=1n−1​i⨁(n−i). 20%,n≤1e6; ...

  4. 【无码专区4】幸运数字4(折半搜索+计数+结论)

    因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...

  5. 【无码专区10】第K大查询(双向链表 /主席树+st表)

    已自我实现,但还是归入无码专区序列.哈哈哈哈哈 对于my idea部分,我的每一个想法都实现了,可供参考. problem 给定一个 1∼n1\sim n1∼n 的排列和 kkk,求所有 r−l+1≥ ...

  6. 【无码专区8】三角形二维数点——计数有多少个给定点落在三角形区域内

    因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...

  7. 【无码专区7】括号序列(思维)

    因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...

  8. 【无码专区6】球与盒子(数学线性筛)

    因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...

  9. 【无码专区5】01串(大讨论+构造)

    因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...

最新文章

  1. ios模拟器快捷键操作
  2. Python打包程序
  3. Path环境变量的理解以及设置MinGW环境变量
  4. python学习知识以及就业方向_Python需要学到什么技术 学完可以从事哪些行业
  5. .fnt 字体不能正常显示
  6. BackTrack5(BT5)安装教程及BT5支持网卡列表
  7. i5 10400f和r7 2700x选哪个?
  8. CHM文档编辑制作及电子书的相关问题 - txfast的日志 - 网易博客 http://txfast.blog.163.com/blog/static/40536042200832065417/
  9. JDBC+MySQL入门增删改查案例
  10. mysql数据库设置密码
  11. 高德地图实现的数据统计切换街景地图
  12. Python内置函数、匿名函数
  13. 求不定积分的系列题型(一)
  14. POJ(8463)-----Stupid cat Doge(openjudge)
  15. 又来了!10分钟实现微信 “炸屎“大作战
  16. 百度云PCS调试过程
  17. 【LaTeX】LaTeX新手入门教程-基础排版
  18. [10 Jun 2015 ~ 11 Jun 2015] Deep Learning in arxiv
  19. java时钟课程设计_JAVA课程设计报告电子钟
  20. 2021年全球及中国卷烟产销量、主营企业经营现状及发展趋势分析[图]

热门文章

  1. 李国庆离开当当,广东消委会告长隆,智能校服提供定位功能,全球首个5G火车站来了,这就是今天的大新闻...
  2. 有计算机信号专业吗,计算机医学图像及信号处理
  3. nashorn js 调用 java_从nashorn(JDK 8 JavaScript引擎)调用char []输入参数调用Java函数?...
  4. pythonresponse对象的属性_Scrapy中response属性以及内容提取
  5. html省市区选择器代码,js实现一个省市区三级联动选择框代码分享
  6. python气象数据处理与绘图_Python气象数据处理与绘图:纬高图的另一种思路
  7. anaconda和python有什么不一样_黄山毛峰的味道为什么会不一样?
  8. linux系统故障实验,Linux常见系统故障排除
  9. php获取昨日时间段内,PHP 获取 特定时间范围 类
  10. php phpmailer qq邮箱,QQ邮箱利用PHPmailer发送邮件