278. 数字组合 - AcWing题库

给定 N 个正整数 A1,A2,…,AN,从中选出若干个数,使它们的和为 M,求有多少种选择方案。

输入格式

第一行包含两个整数 N 和 M。

第二行包含 N 个整数,表示 A1,A2,…,AN。

输出格式

包含一个整数,表示可选方案数。

数据范围

1≤N≤100,

1≤M≤10000,

1≤Ai≤1000,

答案保证在 int 范围内。

输入样例:

4 4

1 1 2 2

输出样例:

3

1.把题意理解成在一个体积为M的背包里,放入体积为Ai的物品;

2.状态确立:f[i][j]表示装入第i个物品已用j体积时总方案的数量

3.状态转移:

1.加入第i个物品:f[i][j] += f[i - 1][j - v[i]]

2.不加入 : f[i][j] += f[i - 1][j]

4.滚动数组优化:

我们每一次更新f数组,都是从i - 1状态时的数组转移过来的。

每一次更新时所用的数据都是上一次的数组,就像一次一次滚动一样。

只需要同时存在一个数组就可以完成所有过程,所以把i的那一维消掉,变成f[j]。

但这么做有一个条件。

比如我们在更新f[j] += f[j - v[i]]时,f[j - v[i]]尚且用的是上一次留下(未更新的f数组)。但假设我们的j是从小到大遍历的,我们之后的f[j] += f[j - v[i]]中的f[j - v[i]],可能是由这次循环中被更新的数据而并非上次循环的数据。也就是说v[i]被无限使用了(这也是为什么完全背包j是从小到大遍历的)。

为了避免这种错误,我们需要让j从大到小遍历,这种做法往往和滚动数组搭配使用。

滚动数组是我们降维从而减小空间复杂度(往往是数组大小)的重要手段。

滚动数组不会减小时间复杂度。

5.代码

消去i后不放的情况变为f[i + 1][j] += f[i][j],循环会自动实现所以不用管

#include<bits/stdc++.h>using namespace std;const int N = 10010;int n,m;
int f[N];int main()
{cin >> n >> m;f[0] = 1;for(int i = 0;i < n;i ++){int v;cin >> v;for(int j = m;j >= v;j --)f[j] += f[j - v];}cout << f[m] << endl;return 0;
}

数字组合(算法竞赛进阶指南)相关推荐

  1. 《算法竞赛进阶指南》数论篇

    <算法竞赛进阶指南>数论篇(1)-最大公约数,素数筛,欧拉函数,同余,欧拉定理,BSGS <算法竞赛进阶指南>数论篇(1)-最大公约数,素数筛,欧拉函数,同余,欧拉定理,BSG ...

  2. 《算法竞赛进阶指南》打卡-基本算法-AcWing 93. 递归实现组合型枚举:递归与递推、dfs、状态压缩

    文章目录 题目解答 题目链接 题目解答 分析: 此题和笔者另一篇博文很像,只不过是限定了个数.<算法竞赛进阶指南>打卡-基本算法-AcWing 92. 递归实现指数型枚举:递推与递归.二进 ...

  3. 《算法竞赛进阶指南(by 李煜东)》习题题解 集合

    又是笔者给自己挖的大坑. 这里是李煜东所著<算法竞赛进阶指南(by 李煜东)>的习题题解集合. 有任何错误请在对应文章下反馈或联系 nicest1919@163.com ,谢谢 qwq 从 ...

  4. CH5202 自然数拆分Lunatic版(算法竞赛进阶指南,完全背包)

    算法竞赛进阶指南,278页,完全背包 本题要点: 1.把完全背包的代码改改即可.常规的完全背包: 有n个物品,每个物品的体积是v[i], 价值是w[i], 求装到大小为m的大背包,能获得的最大价值(每 ...

  5. 中位数--《算法竞赛进阶指南》(货仓选址和七夕祭问题详解)

    中位数 今天又和大家见面了啦~ 依旧是 <算法竞赛进阶指南>的学习哦~ 中位数(Median)又称中值,统计学中的专有名词,是按顺序排列的一组数据中居于中间位置的数,代表一个样本.种群或概 ...

  6. 金字塔(算法竞赛进阶指南)

    虽然探索金字塔是极其老套的剧情,但是有一队探险家还是到了某金字塔脚下. 经过多年的研究,科学家对这座金字塔的内部结构已经有所了解. 首先,金字塔由若干房间组成,房间之间连有通道. 如果把房间看作节点, ...

  7. AcWing 122. 糖果传递【贪心】【《算法竞赛进阶指南》,微软面试题 , HAOI2008】

    AcWing 122. 糖果传递 一.题目链接 二.题目分析 (一)算法标签 (二)解题思路 三.AC代码 四.其它题解 一.题目链接 AcWing 122. 糖果传递 进阶题目 AcWing 105 ...

  8. 算法竞赛进阶指南 骑士放置

    4: 最大独立集 :选出最多的点,使得选出的点之间没有边. 求最大独立集:选出最小的点可以破坏所有的边 <==>最小点覆盖 <==>最大匹配数. 假设最大匹配数为m,共有n个点 ...

  9. 算法竞赛进阶指南 萌新入门!

    算法竞赛进阶指南 文章目录 算法竞赛进阶指南 前言 一.介绍本书 二.如何阅读本书 三.总结 **笔记思路和结构 ** 算法竞赛进阶指南 这篇文章就简单的写一下吧! 前言 ​ 作为一个想要入坑的算法的 ...

  10. 算法竞赛进阶指南0x3A 博弈论之SG函数

    算法竞赛进阶指南0x3A 博弈论之SG函数

最新文章

  1. 需求文件requirements.txt的创建及使用
  2. python中exit的作用_python中,exit,return,sys.exit()等的区别与使用方法 | 学步园
  3. Unity3D内容加密保护
  4. 通过Field (反射)给私有字段赋值
  5. plsql oracle client没有正确安装(plsql连接远程数据库)
  6. 【实用软件】picasa不能导入文件夹至其中 的问题解决
  7. Panel控件的使用
  8. DLL的远程注入技术
  9. 分享一个蛋白互作网站——String (一)
  10. Azure与Aliyun服务对比
  11. cenos 解决Kernel panic – not syncing: Attempted to kill init
  12. 卡尔曼滤波与组合导航原理_图解卡尔曼滤波器,无需深厚的数学知识也易懂(第五部分:多维卡尔曼滤波器)...
  13. js 时间戳与日期时间的相互转换
  14. 微信小程序开发之城市选择器 城市切换
  15. spring家族 img圖
  16. 蓝桥杯大赛 青少年创意编程 第十三届 C++组
  17. RK3188的wifi无法切换4G上网问题
  18. 算法设计与分析100例子(C语言版)
  19. 一个整数,它加上100后是一个完全平方数,加上168又是一个完全平方数,问该数是多少
  20. c#//创建一个包含 10 个元素的 int 一维数组, 从键盘接收其值;当用户输入非法时,提示重新输入;暂时没有实现,。

热门文章

  1. B2B电子商务网站建设怎么做:B2B系统开发流程、语言、架构解答
  2. JavaScript随机生成字母、数字
  3. 联通签到php,联通营业厅微博双签(云函数自动签到)
  4. Windows目录结构、移动、复制、搜索文件及文件夹等
  5. 金山快盘 linux,WPS移动版5.5发布 支持金山快盘双向读写
  6. 程序员必读:“五险一金”详解!
  7. 格林纳达常驻WTO大使孙宇晨发布声明祝贺北京冬奥会顺利召开
  8. Mybatis-plus中QueryWrapper的使用
  9. “独享宽带”是什么意思?
  10. 2019 ICPC南昌邀请赛比赛游记 队伍名:莫比乌斯