AcWing 278. 数字组合

  • 一、问题
  • 二、思路
    • 1、状态表示
    • 2、状态转移
    • 3、循环设计
    • 4、初末状态
  • 三、代码

一、问题

二、思路

这道题其实看上去和我们的01背包问题是非常相似的。如果这道题我们转化为01背包问题的话,描述如下:
给很多个物品和体积,然后从中任取几个物品能够恰好填满背包的方案数。

1、状态表示

f [ i ] [ j ] f[i][j] f[i][j]表示从 i i i个物品里面选,经过选择后,总体积恰好为 j j j的方案数

2、状态转移

这道题既然能够转化为了背包问题,那么我们就可以尝试用背包问题中状态转移方程的书写思路解决这道题。
那么对于前i个物品而言,我们可以根据第i个物品是否选择来写转移方程,这样的话,我们就能够把问题规模从i减小为i-1。选或者选,总共两种情况,我们只需要把这两种情况加起来就可以算出总的方案数。

f ( i , j ) = { f ( i − 1 , j ) j < v [ i ] f ( i − 1 , j − v [ i ] ) + f ( i − 1 , j ) j ≥ v [ i ] f(i,j)= \begin{cases} f(i-1,j)&j< v[i]\\ f(i-1,j-v[i])+f(i-1,j)&j\geq v[i] \end{cases} f(i,j)={f(i−1,j)f(i−1,j−v[i])+f(i−1,j)​j<v[i]j≥v[i]​

3、循环设计

循环设计的话就很简单了,我们只需要将物品数量i作为外层循环即可,这样的话我们更加方便对其进行空间优化。

4、初末状态

初末状态对于这道题而言是非常关键的,因为对于之前的题目而言,我们求的是物品的价值,但是当背包容量是0的时候,我们没有选择任何物品,此时最大价值是0。也就是说,我们不需要初始化。

但是这道题不一样,这道题求的是方案数,如果我们的数字个数是0个,m又恰好等于0。此时我们从0个数中,选取几个数,使得这些数的总和恰好是0,这种方案数是1。

所以我们需要将f[0][0]初始化为1。

而题目中的恰好二字,就体现在 f [ 0 ] [ 0 ] = 1 f[0][0]=1 f[0][0]=1这行代码。

三、代码

代码这里就写一个空间优化过后的代码吧。

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=110000;
int a[N],f[N];
int n,m;
int main()
{cin>>n>>m;for(int i=1;i<=n;i++)scanf("%d",a+i);f[0]=1;for(int i=1;i<=n;i++)for(int j=m;j>=0;j--)if(j>=a[i])f[j]=f[j]+f[j-a[i]];cout<<f[m]<<endl;return 0;
}

AcWing 278. 数字组合相关推荐

  1. 数字组合(算法竞赛进阶指南)

    278. 数字组合 - AcWing题库 给定 N 个正整数 A1,A2,-,AN,从中选出若干个数,使它们的和为 M,求有多少种选择方案. 输入格式 第一行包含两个整数 N 和 M. 第二行包含 N ...

  2. [01背包] 数字组合(01背包+求方案数)

    文章目录 0. 前言 1. 01背包求方案数 0. 前言 相关: [背包] 背包问题算法模板(模板) 1. 01背包求方案数 278. 数字组合 将 M 看作背包容量,每个数看成一个物品,Ai 看成是 ...

  3. python编程实战(二):一文教你生成随机验证码!大小写字母与数字组合,位数可以控制

    随机验证码的生成 前言 正文 实现 代码 效果 前言 验证码验证,是常见的安全验证的一种方式,可以用来杜绝脚本和机器人操作等等: 除了本文介绍的简单的验证码之外,还有拼图验证.文字顺序验证等常见的验证 ...

  4. validate验证长度 vue_vue input 输入校验字母数字组合且长度小于30的实现代码

    下面一段代码给大家分享vue input 校验字母数字组合且长度小于30,具体代码如下所示: validateJyh(glhm){//校验关联交易号 var reg = /^[A-Za-z0-9]{1 ...

  5. 检索数据_20_按照字符串数字组合的排序

    按照字符串数字组合的排序 需求描述 需求:假设我们从雇员表emp里创建个视图,这里仅有一个字段,该字段叫data由员工名称和部门号拼接而成,我们想实现一个查询可以按照原来的部门编号逆序排序筛选出数据. ...

  6. python电话号码对应的字符组合_Python3 在字符串中提取字母+数字组合微信账号、电话等 - pytorch中文网...

    今天处理数据要提取字符串中的微信,字符串中包含中文英文Emoji,标点符号等. python 提取字符串中的电话 提取电话相对简单,多个电话也可以提取 import re desstr = " ...

  7. 小数位数_圆周率的小数位是否包含了所有的数字组合?

    人们很早就认识到,无论多大的圆,其周长除以直径是一个恒定的常数,该常数被称为圆周率.一直以来,数学家知道圆周率是一个小数,但并不清楚这个小数是否是循环的.为此,数学家不断想办法计算出更多小数位的圆周率 ...

  8. Acwing 1084. 数字游戏 II

    Acwing 1084. 数字游戏 II 题意: 指定一个整数闭区间 [a.b],问这个区间内有多少个取模数. 取模数:这种数字必须满足各位数字之和 mod N 为 0. 题解: 数位dp 这里不细讲 ...

  9. Acwing 1082. 数字游戏

    Acwing 1082. 数字游戏 题意: 现在大家决定玩一个游戏,指定一个整数闭区间 [a,b],问这个区间内有多少个不降数. 题解: 利用数位dp的套路来做 我们还是利用前缀和来做 我们先求1~n ...

最新文章

  1. xface 远程桌面 无法使用tab键盘
  2. windows下tomcat自动定时重启方法
  3. (chap2 TCP/IP基础知识) TCP/IP协议分层模型
  4. 祖龙娱乐王远明:如何用UE4做出3A级材质和天气系统?
  5. Linux 安装Opencv3.2
  6. 【图示,简单明了】HttpServlet中getAttribute和getParameter的区别——【javaweb系列学习笔记】
  7. 过去式加ed的发音_小学英语动词过去式归类总结
  8. RSA China 2011女嘉宾:用更好的武器应对带枪的敌人!
  9. 正则表达式学习(一)
  10. 23. Element lastChild 属性
  11. 0X00000000指令引用的0x00000000内存该内存不能为read或written
  12. Exception: ROM is missing for ms_pacman, see https://github.com/openai/atari-py#roms for instruction
  13. 【解读】阿里巴巴 MySQL 数据库规约
  14. 计算机名人堂(历届图灵奖获得者)
  15. 【奥黛丽赫本】女神一样的优雅
  16. 大学计算机组装作业台式,组装一部单机作业基本型计算机的50步骤
  17. AT32F435/437的如何选择选择代码启动地址
  18. C语言实现strcpy和strcmp
  19. 这个世界,总是被设计得刚刚好?人类或许只是被设定的一个程序
  20. Toward a More Complete, Flexible, and Safer Speed Planning for Autonomous Driving via Convex Optimiz

热门文章

  1. 无需兑换码下载来自设备制造商的 HEVC 视频扩展
  2. one-hot和Embedding
  3. 什么护眼灯对眼睛好?2022最具性价比的护眼灯推荐
  4. 娱乐万岁,躺平无罪!聊点有技术含量的
  5. 计算机磁盘损坏问题与系统的重置和重装
  6. 陶瓷气体放电管(GDT)的评定及试验条件-优恩
  7. [安洵杯 2019]吹着贝斯扫二维码
  8. 依托Airship,ATT走进混合云的世界
  9. NC57,NC63-NC二开经验总结
  10. sonicwall TZ-105 防火墙基本介绍