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

news2024/9/25 3:28:02

题目描述:

给定 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入Facebook的世界:探索数字化社交的无限可能性

引言 随着数字化时代的到来&#xff0c;社交媒体平台已经成为了人们日常生活中不可或缺的一部分&#xff0c;而其中最为突出的代表之一便是Facebook。作为全球最大的社交媒体平台之一&#xff0c;Facebook不仅仅是一个社交网络&#xff0c;更是一个数字化社交的生态系统&#…

Windows/Linux-openEuler系统使用路由侠内网穿透,部署项目详细教程

文章目录 Windows/Linux-openEuler系统使用路由侠内网穿透&#xff0c;部署项目详细教程一、在windows系统下载安装路由侠并实现项目部署1、下载路由侠并注册安装到Windows系统2、点击内网映射&#xff0c;添加映射&#xff0c;注册域名前缀3、选择网站应用4、配置你想要代理项…

【Bug-ModuleNotFoundError: No module named ‘models‘】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Python &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 出现这个错误&#xff1a; 出现了ModuleNotFoundError: No module named models’的问题。 文件在Model…

「吞噬星空」存在哪些境界,不朽级呼延博是否有一席之位?

吞噬星空中浩瀚无垠的宇宙&#xff0c;其深邃与广阔&#xff0c;仿佛一个无尽的迷宫&#xff0c;蕴藏着无数未知的境界。从地球出发&#xff0c;见证了行星级与恒星级的威能&#xff0c;然而这只是宇宙力量的冰山一角。行星级强者&#xff0c;在地球上已是至高无上的存在&#…

MTransE阅读笔记

Multilingual Knowledge Graph Embeddings for Cross-lingual Knowledge Alignment 用于交叉知识对齐的多语言知识图谱嵌入(MTransE) Abstract 最近的许多工作已经证明了知识图谱嵌入在完成单语知识图谱方面的好处。由于相关的知识库是用几种不同的语言构建的&#xff0c;因…

2010-2021年银行网点及员工信息数据

2010-2021年银行网点及员工信息数据 1、时间&#xff1a;2010-2021年 2、来源&#xff1a;整理自csmar 3、指标&#xff1a;银行代码、股票代码、银行中文简称、统计截止日期、分行数量、机构网点数量、其中&#xff1a;境内网点数量、其中&#xff1a;境外网点数量、在职员…

python和c语言的区别是什么

Python可以说是目前最火的语言之一了&#xff0c;人工智能的兴起让Python一夜之间变得家喻户晓&#xff0c;Python号称目前最最简单易学的语言&#xff0c;现在有不少高校开始将Python作为大一新生的入门语言。本萌新也刚开始接触Python&#xff0c;发现Python与其他语言确实有…

在Semantic Kernel中使用Qdrant向量数据库

本文将介绍如何在Semantic Kernel中使用Qdrant向量数据库&#xff0c;并演示如何在Semantic Kernel中进行向量更新和查询操作。 1. 背景 在前一篇文章《Qdrant 向量数据库的部署以及如何在 .NET 中使用 TLS 安全访问》中&#xff0c;我们介绍了如何使用 Docker 部署 Qdrant 向…

9-Dubbo源码分析之:Dubbo Serialize 层:多种序列化算法,总有一款适合你

通过前面课时的介绍&#xff0c;我们知道一个 RPC 框架需要通过网络通信实现跨 JVM 的调用。既然需要网络通信&#xff0c;那就必然会使用到序列化与反序列化的相关技术&#xff0c;Dubbo 也不例外。下面我们从 Java 序列化的基础内容开始&#xff0c;介绍一下常见的序列化算法…

PCB损耗来源

信号经过PCB板会产生损耗&#xff0c;主要包括导体损耗&#xff0c;介电损耗和辐射损耗 导体损耗&#xff1a;导体损耗是由于电流流动过程中产生电阻损耗而发热。 介电损耗&#xff1a;介电损耗是由于电场通过介质时分子的交替极化和晶格碰撞造成的。 辐射损耗&#xff1a;辐…

能够解析任何编程语言的开源语法解析树 | 开源日报 No.171

tree-sitter/tree-sitter Stars: 14.6k License: MIT tree-sitter 是一个用于编程工具的增量解析系统。 该项目的主要功能、关键特性、核心优势包括&#xff1a; 通用性&#xff0c;能够解析任何编程语言高效性&#xff0c;能够在文本编辑器中每次按键都进行解析健壮性&…

pygame用chatgpt绘制3d沿x轴旋转的

import pygame from pygame.locals import * import sys import mathpygame.init()width, height 800, 600 screen pygame.display.set_mode((width, height))vertices [(0, 100, 0), (100, 200, 0), (300, 100, 0)]angle 0 rotation_speed 2 # 可根据需要调整旋转速度 c…

javaWeb项目-火车票订票信息系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Spring Boot框架 …

c++核心学习--继承2

4.6.7多继承语法 4.6.8菱形继承 利用虚继承解决菱形继承的问题&#xff1a;继承之前加上关键字virtual变为虚继承

35岁的程序员,该何去何从?

2024 年&#xff0c;是充满未知和挑战的一年。AI 的发展日新月异&#xff0c;已经有人用它来写代码了&#xff0c;啥时候会替代程序员&#xff0c;可真不好说。另一方面&#xff0c;程序员扎堆的 IT 互联网行业却进入了平台期甚至下行期&#xff0c;降本增效成为行业主流&#…

详细解析记忆泊车的顶层技术原理

详细解析记忆泊车的顶层技术原理 附赠自动驾驶学习资料和量产经验&#xff1a;链接 相对于记忆行车而言&#xff0c;记忆泊车 MPA&#xff08;Memory Parking Assist&#xff09;可以看成是停车场区域内的一个自动驾驶功能&#xff0c;可帮助用户按记忆的路线自动巡航并泊入车…

Kubernetes 知识体系 系列一

多年前&#xff0c;大多数软件应用程序都是大型的单体&#xff0c;要么作为单个进程运行&#xff0c;要么作为少数服务器上的少量进程运行。这种过时的系统一直延续很久。 它们的发布周期较慢&#xff0c;更新相对较少。 在每个发布周期结束时&#xff0c;开发人员将整个系统…

第三十二天-PythonWeb主流框架-Django框架

目录 1.介绍 发展历史 介绍 2.使用 1.安装 2.创建项目 3.项目结构 4.启动 3.开发流程 1.设置ip可访问 2.创建模块 3.第一个页面 4.视图 5.include()参数 6.url与视图的关系 7.响应内容 4.视图处理业务逻辑 1.响应html 2.获取url参数 3.从文件响应html内容 …

一招让你的薪水暴增,每个程序员都应该学会跟老板提加薪

为什么要学会薪资谈判&#xff1f; 在最近的一篇文章中&#xff0c;职业专家奥斯汀贝尔卡克 (Austin Belcak ) 解释了进行一点薪资谈判如何对您的长期收入产生巨大影响。 这是奥斯汀在他的薪资谈判示例中描绘的场景&#xff1a; Amari 和 Taylor 的年薪均为 50,000 美元 未来…

Java实现猜数字游戏:编程入门之旅

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …