货币系统(闫氏DP分析法)

题目描述:

给定 V 种货币(单位:元),每种货币使用的次数不限。

不同种类的货币,面值可能是相同的。

现在,要你用这 V 种货币凑出 N 元钱,请问共有多少种不同的凑法。

输入格式:

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

接下来的若干行,将一共输入 V 个整数,每个整数表示一种货币的面值。

输出格式:

输出一个整数,表示所求总方案数。

数据范围:

1≤V≤25
1≤N≤10000
答案保证在long long范围内。

输入样例:

3 10
1 2 5

输出样例:

10

分析步骤:

  第一:我们可以看到题目要求我们统计出有多少种凑法,每种货币可以用无限次,只要不超过N元钱就可以,这就非常符合我们的完全背包问题,所以我们只需要运用背包DP的方法,就可以解出这道题目。

  第二:运用闫氏DP分析法

  • 根据闫氏DP分析法我们可以知道dp问题可以将其分解为两个步骤:第一种是状态表示,第二种是状态计算。

  • 我们所有的背包问题都是围绕我们对于集合的定义来的,所以这个定义是非常重要的!!!我们将集合定义为:所有只从前i个货币中选择,总金额不超过 j 的方案的集合。

  • 状态计算:由于完全背包是可以无限次的选择物品的,所以我们不能和01背包一样,只将其分解为选或者不选,因为它可以有很多很多种选择,可以不选可以选一种,可以选两种...只要金额(背包体积)足够大就可以。

  • 如果他不选择物品 i 那么这种情况相当于从(1,i - 1)中选择金额不超过j的情况是一样的所以我们的表达式是:f[i-1][j]。

  • 如果他选择物品 i 那么这样又该如何表示呢?我们并不知道他到底要选择几个物品,那应该怎么做呢?假如我们选择一个的话那么就应该写为f[i-1][j-vi];假如我们选择两个的话那么就应该写为f[i-1][j-2*vi];假如我们选择k个的话那么就应该写为f[i-1][j-k*vi],那么我们最终的答案就应该在这些集合之中

  • 所以f(i,j)  = f(i-1 , j) + f(i-1 , j - v) + f(i-1 , j - 2v) + ........+f(i-1 , j - (j/v)*v);

  • 所以f(i,j-v) = f(i-1 , j - v) + f(i-1 , j - 2*v) + f(i-1 , 3*v) + ........f(i-1 , j - (j/v)*v);

  • 由上述两个式子,我们可以知道如果将 j 替换成 j-vi 两个式子非常相似。f[ i ] [ j ] = f[ i -1][ j ] + f[ i ][ j - vi ] ;

  第三:书写主函数,构建整体架构:

  • 输入值,更新我们的初始状态f[0][0] = 1。为什么等于1?因为围绕我们的定义:只从前i个货币中选择,总金额不超过 j 的方案的集合。所以f[0][0]表示的是在前0个货币中选总金额为0时的方案数为1,因为都不选也是一种方案。

  • for循环输入货币的面额,for循环去遍历金额的大小从0开始,根据上图的公式我们可以推断出来f[i][j] = f[i-1][j] + f[i][j-x];所以利用此公式我们就可以得出答案。但是注意一个问题:选择一个,选择两个,是在金额大于我们的货币面值的情况下才可以选,假如答案的金额都要小于货币面额的话就不可以选了!

  • 。所以加一个判断只有j(金额) >= x(货币面额)才可以去选择。

for(int j = 0 ; j <= m ; j ++){
            f[i][j] = f[i-1][j];
            if(j >= x) f[i][j] +=  f[i][j-x];
        }

01背包从后往前,完全背包从前往后!!

代码:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 30 , M =10010;
typedef long long LL;

LL n , m;
LL f[N][M];

int main()
{
    cin>>n>>m;
    f[0][0] = 1;
    for(int i = 1 ; i <= n ; i ++ ){
        int x ;
        cin>>x;
        for(int j = 0 ; j <= m ; j ++){
            f[i][j] = f[i-1][j];
            if(j >= x) f[i][j] +=  f[i][j-x];
        }
    }
    cout<<f[n][m];
    
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/496590.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

路由的完整使用

多页面和单页面 多页面是指超链接等跳转到另一个HTML文件,单页面是仍是这个文件只是路由改变了页面的一部分结构. 路由的基本使用 使用vue2,则配套的路由需要是第3版. 1)下载vue-router插件 2)引入导出函数 3)new 创建路由对象 4)当写到vue的router后只能写路由对象,因此只…

CImage 类及其常用成员函数用法实例详解 一

Cimage类是一个用于处理图像的类&#xff0c;它的主要用途是方便地创建、编辑、保存和显示图像。Cimage类支持多种图像文件格式&#xff0c;包括BMP、GIF、JPG、PNG和TIF等。较CBitmap类使用起来更方便。其构造函数及成员函数如下&#xff1a; 下面详细说明CImage常用成员函数的…

解决Animate.css动画效果无法在浏览器运行问题

背景 在开发官方网站的时候&#xff0c;临时更换了电脑&#xff0c;发现原本正常的动画效果突然不动了。 经过 chrome、Microsoft Edge都无法运行。 Animate.css | A cross-browser library of CSS animations. 问题排查 通过审查元素后发现类名是注入并且生效的。 验证 然…

【漏洞复现】企互联-FE企业运营管理平台uploadAttachmentServlet接口存在任意文件上传漏洞

漏洞描述 FE企业运营管理平台(以下简称FE6.5)是基于互联企业云工作台,以移动技术、云计算、大数据处理技术、传感技术等信息技术为支撑,和各类业务系统全面融合的移动化云平台,分为企业版和集团版,能满足各种规模企业的信息化建设需求。FE6.5以移动、平台、社交、云及大…

OpenHarmony实战开发-List组件的使用之设置项

介绍 在本篇CodeLab中&#xff0c;我们将使用List组件、Toggle组件以及Router接口&#xff0c;实现一个简单的设置页&#xff0c;点击将跳转到对应的详细设置页面。效果图如下&#xff1a; 相关概念 CustomDialog&#xff1a;CustomDialog装饰器用于装饰自定义弹窗。List&…

Apifox 新版发布:多分支升级、Query 参数支持枚举、自定义快捷键全面解读

看看本次版本更新主要涵盖的重点内容&#xff0c;有没有你所关注的功能特性&#xff1a; 多分支能力持续升级Query 参数支持枚举等高级配置支持自定义快捷键支持全局设置是否允许返回响应里有额外字段支持导入非 API 的 Markdown 文件更多 CI/CD 平台集成环境变量支持实时协作…

基于springboot+vue+Mysql的“智慧食堂”设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

查找总价格为目标值的两个商品【双指针】

这道题实际上跟本专栏上一题属于同一类型&#xff0c;是上一题的简单版&#xff0c;可以点击跳跃。 ⬇ 有效三角形的个数【双指针】 法一&#xff1a;暴力求解 class Solution { public:vector<int> twoSum(vector<int> &nums, int target){int n nums.size()…

Numpy 初体验

文章目录 第1关&#xff1a;Numpy 创建数组第2关&#xff1a;Numpy 数组的基本运算第3关&#xff1a;Numpy 数组的切片与索引第4关&#xff1a;Numpy 数组的堆叠第5关&#xff1a;Numpy 的拆分 第1关&#xff1a;Numpy 创建数组 编程要求 本关的任务是&#xff0c;补全右侧编辑…

用docker在局域网虚拟一个docker虚拟机,支持单独ip,gpu,systemd,在docker里面安装docker

可以实现局域网内虚拟一台linux服务器&#xff0c;效果类似虚拟机&#xff0c;用docker实现&#xff0c;需要注意&#xff0c;这种方式和宿主机是不能通讯的&#xff0c;但是可以和局域网内的设备通讯 觉得好用可以加作者wx: lx-ivan 编写dockerfile vim Dockerfile FROM u…

飞鸟写作怎么用 #经验分享#学习方法#学习方法

飞鸟写作是一款非常好用的论文写作工具&#xff0c;它不仅能够帮助用户写作论文&#xff0c;还可以检测论文的原创性和查重率&#xff0c;是许多学生和研究人员的首选工具。 使用飞鸟写作非常方便&#xff0c;用户只需将论文复制粘贴到工具中&#xff0c;就能够快速得到论文的原…

【Hello,PyQt】控件拖拽

在 PyQt 中实现控件拖拽功能的详细介绍 拖拽功能是现代用户界面设计中常见的交互方式之一&#xff0c;它可以提高用户体验&#xff0c;增加操作的直观性。在 PyQt 中&#xff0c;我们可以很容易地实现控件之间的拖拽功能。本文将介绍如何在 PyQt 中实现控件的拖拽功能。 如何实…

初识C++ · 入门(1)

目录 前言&#xff1a; 1 命名空间 2 输入和输出 3 缺省参数 5 函数重载 前言&#xff1a; C与C语言是有一定交集的&#xff0c;可以理解为本贾尼在使用C语言的时候认为有缺陷&#xff0c;于是加了一些小语法进行改良&#xff0c;后来经过委员会的修改&#xff0c;C98问世…

C#手术麻醉系统源码 可对接HIS LIS PACS 医疗系统各类设备 医院手麻系统源码

C#手术麻醉系统源码 可对接HIS LIS PACS 医疗系统各类设备 手术麻醉信息管理系统主要还是为了手术室开发提供全面帮助的系统&#xff0c;其主要是由监护设备数据采集子系统和麻醉临床系统两个子部分组成。包括从手术申请到手术分配&#xff0c;再到术前访视、术中记录及术后…

在Linux搭建Emlog博客结合内网穿透实现公网访问本地个人网站

文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总结 前言 博客作为使…

如何使用Python读取、旋转和和创建空白的PDF文件

试想象一下&#xff0c;你正在处理一堆PDF文件&#xff0c;需要从中提取一些信息或者修改其中的内容。如果你不使用Python&#xff0c;你可能需要手动打开每个文件&#xff0c;复制粘贴你需要的内容&#xff0c;然后再保存为一个新的文件。这简直是一场噩梦&#xff01;但是&am…

C++从入门到精通——命名空间

命名空间 前言一、命名空间引例什么是命名空间 二、命名空间定义正常的命名空间定义嵌套的命名空间多个相同名称的命名空间 三、命名空间使用加命名空间名称及作用域限定符使用using将命名空间中某个成员引入使用using namespace 命名空间名称引用引用命名空间和引用头文件有什…

手写启动类(start)

为什么要手写一个start&#xff1f; 简化代码&#xff0c;仅使用一个注解就可以实现分页功能(以下以分页为例)。 1.定义一个pageX注解 Documented Retention(RetentionPolicy.RUNTIME)//运行时可以通过反射API获取到注解信息 Target({ElementType.METHOD, ElementType.TYPE})…

redis的设计与实现(四)——单机数据库特性

1. 前言 我们前面了解了redis的数据结构&#xff0c;对象。但是redis对于这些对象的使用和管理策略需要也熟记于心&#xff0c;这篇文章我们就了解一下吧。 2. 类型检查和命令多态 DEL,EXPIRE,RENAME,TYPE,OBJECT 可以对任何数据类型执行SET,GET,APPEND,STRLEN&#xff0c;等…

【opencv】教程代码 —ImgProc (10)图像平滑处理

10. Smoothing.cpp 图像平滑处理 演示不同滤波器的效果。这些滤波器包括均值滤波、高斯滤波、中值滤波和双边滤波。每个滤波器都会在原始图像上应用&#xff0c;并显示滤波后的效果。 /*** 文件 Smoothing.cpp* 简单滤镜的样例代码* 作者 OpenCV团队*///引入所需库文件 #includ…