Cow Cash G (动态规划 完全背包)

题解:洛谷 P1474 [USACO2.3] Money System / [USACO07OCT] Cow Cash G 题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。母牛们不但创建了它们自己的政党,而且选择了建立了自己的货币系统。由于它们特殊的思考方式,它们对货币的数值感到好奇。写一个程序来计算有多少种方法用给定的货币系统来构造一定数量的面值。母牛们想知道有多少种不同的方案来用货币系统中的货币来构造一个确定的面值。第一行两个整数,代表货币系统中货币的种类数目。个整数,代表所有货币的单位面值。的单位面值组成的货币系统产生。位带符号整数的范围内。本文分享的必刷题目是从。 阅读详情

题目大意:

洛谷题目传送门


解题思路:

这似乎是一道很好的爆搜题,但是我们还是得跟着那句老话走

能用动态规划就别用别的

动态规划,AC可以变得很神奇,但是思考状态转移的时候真的可以让人脑袋爆掉!!

那么切回正题,这题怎么做?
看到货币可以无限使用,那么不难发现这是一道类似于完全背包的动规了

首先设定状态,我们将 i i i的方案数表示为 d p i dp_i dpi​。接下来,我们考虑阶段——设我们为了组合出 i i i,我们选择一张面值为 a i a_i ai​ 的货币来尝试组合,那么他的方案数变成了 d p i − a i dp_{i-a_{i}} dpi−ai​​,如果选择用面值为 a i + 1 a_{i+1} ai+1​ 的货币来尝试组合 i i i ,那么方案数就变成了 d p i − a i + 1 dp_{i-a_{i+1}} dpi−ai+1​​ ……

一直这么下去,方程不就出来了吗?

d p i + = d p i − a i dp_i+=dp_{i-a_{i}} dpi​+=dpi−ai​​

接下来,我们解决最后一个问题, d p dp dp 数组的初始状态是什么?
因为 d p i dp_i dpi​ 表示 i i i 的方案数,所有我们可以自然而然的从 d p 0 dp_0 dp0​ 开始思考初始状态——我们也能自然而然的认为 d p 0 dp_0 dp0​ 的初值是0——也正是因为这个错误,我整个程序崩了,甚至让我以为是我的转移方程推错了!!

不要只记得状态转移方程,初值的问题也值得我们重视

我们可以选择换一个思路理考货币所组成的价钱:
例如:
组成一个 18 单位面值的货币可以是这样的:8×2+2×1
其实我们可以在这条分解式后面再加一个虚无的货币面值:8×2+2×1 + 0
或许有人会问,+0和不+0的面值都是一致的,那么这么做有什么意义?其实不然,我们可以这么理解这个 0,把他看成一个没有面值的货币。什么意思呢?就是 0 其实是一种货币,只不过没有面值而已。是的,我们要把 0 看成一种实际存在的货币。

然后我们再回到 d p 0 dp_0 dp0​ 初值的问题,0这个单位面值无法用任何正常的货币构成,因此我一开始也认为 d p 0 dp_0 dp0​ 就是0,但是现在我们拥有了 货币0 这种假想,所以我们目前的 d p 0 dp_0 dp0​ 的构成情况应该是这样的:

d p 0 = 1 × 0 dp_0=1×0 dp0​=1×0 (注意了,这里的0表示的是一种面值为0的货币!!)

现在我们发现, d p 0 dp_0 dp0​ 其实是有一种构成方案的,也就是说 d p 0 dp_0 dp0​ 实际上应该等于1,因为有一种假想型的 0 货币可以构成它。而 0 这种特殊货币的存在也不会破坏其他 d p i dp_i dpi​ 的答案,也就是说哪怕有了新的货币0,构成 i i i 的可行方案依旧是 d p i dp_i dpi​ 种,不会因为 0 的出现而增多或减少。
这种种现象都证明, d p 0 = 1 dp_0=1 dp0​=1是可行的。

但是,我之前不是说过 d p 0 = 0 dp_0=0 dp0​=0吗?这就矛盾了呀!很简单,我之前说的是错的呗。

推敲出了 d p 0 = 1 dp_0=1 dp0​=1 这个堪比状态转移方程的大条件,一切困难都迎刃而解。

CODE

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
long long n,v,a[1100];
long long dp[101000]={0};
void input()
{
	cin>>n>>v;
	for(int i=0;i<n;i++)
	  cin>>a[i];
}

void DP()
{
	dp[0]=1;
	for(int i=0;i<n;i++)
	  {
	  	for(int j=a[i];j<=v;j++)
	  	  dp[j]+=dp[j-a[i]];  //用完全背包的思路来实现状态转移方程
	  }
	cout<<dp[v];
}

int main()
{
	input();
	DP();
	return 0;
} 

总结:

蓦然回首,我们对动态规划的研究都集中在状态转移方程,对初始值的重视依旧不够,通过这道题,它告诉我们,初值确实重要

PayPal支付集成完全指南:开源库实践 本文介绍了如何从零开始集成PayPal支付功能。首先概述了PayPal提供的多语言SDK和开源库,包括PHP、Python、Node.js等版本。然后详细说明了准备工作,包括注册开发者账号、获取API凭证和使用沙盒环境测试。文章以Node.js为例,演示了安装SDK、基础配置和实现支付流程的完整代码,包括创建订单和捕获支付两个核心功能。最后提及了订阅支付等高级功能,为开发者提供了完整的支付集成方案。通过清晰的代码示例和步骤说明,帮助开发者快速实现PayPal支付功能集成。 阅读详情

相关推荐

Qwen2.5-7B大模型实战:从零部署到高效推理全流程解析

本文详细解析了Qwen2.5-7B大模型从零部署到高效推理的全流程。内容涵盖环境准备、模型下载、使用Transformers进行核心对话推理,并深入介绍了vLLM与TGI生产级服务部署、GPTQ/AWQ量化技术以降低显存消耗,以及llama.cpp、Ollama等本地推理方案。旨在帮助开发者快速掌握部署技巧,实现大模型在消费级硬件上的高效运行。

weixin_29061425的博客 490

完全背包问题(详细解答)

首先完全背包问题需要01背包问题做铺垫,如果读者01背包问题没有解决,一定要理解之后,在看完全背包问题,包括01背包的优化! 这里是01背包 这里是01背包的全部优化 好,我们开始完全背包! 完全背包定义 有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的体积是v[i],价值是val[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 从定义中可以看出,与01背包的区别01背包最多只能拿一件物品,完全背包则不然,只要空间够多,一种物品我可以拿n件! 01

weixin_46503238的博客 2万+

免费AI视频生成全流程:通义千问+Seedance 2.5+Grok实战指南

AI视频生成正在成为内容创作的重要方式,但高昂的API费用常让个人创作者望而却步。实际上,通过合理组合云端免费工具,也能搭建一条完整的视频生产链路:利用大模型生成脚本,用视频生成模型将文本渲染成画面,再借助多模态模型进行一致性校验。这种“文本+视频+多模态”的协作模式,将复杂的生成任务解耦为可独立调用的模块,既降低了本地硬件要求,也为批量内容验证提供了低成本方案。该流程适用于短视频素材快速产出、产品Demo验证以及AI应用集成等场景,核心在于打通免费账号、API调用与批量任务调度。本文以通义千问、Seeda

weixin_29044157的博客 380

动态规划背包问题之完全背包详解

动态规划背包问题之完全背包详解

晨的博客 9087

Ansys 19 Mechanical 流体密封分析

start point是一个特殊的概念,在仿真中ansys将从start point开始搜索会发生流体渗漏的点,可以简单理解为从start point开始,向四周逐个节点比较节点上的接触压紧力与流体压力,如果流体压力大于压紧力,则发生渗漏。事实上此处的最后一个参数是指定start point类型的,为1代表这是一个“open”的start point。在通常情况下,如果不人为指定start point,程序会自动寻找指定流体压力面的“边界”,对于二维情况,就是曲线的两个端点,对于三维情况就是曲面的边线。

Dio980的博客 1534

MATLAB实战:5步搞定GNSS单点定位解算(附完整代码)

本文提供了一份基于MATLAB的GNSS单点定位实战指南。通过5个核心步骤,详细讲解了如何从卫星坐标和伪距观测值出发,利用最小二乘迭代算法,构建并实现一个完整的单点定位解算器。文章附有完整代码,并涵盖精度评估与结果分析,适合GNSS初学者和MATLAB用户快速上手实践。

a2b3c4d5e的博客 250

算法——动态规划:完全背包问题

讲解了如何使用动态规划的思想解决完全背包问题,还使用了滚动数组的思想优化空间复杂度。

qq_61350148的博客 1940

保姆级教程:用TIA Portal V17给S7-1200 PLC和HMI做个联调仿真(附抢答器完整项目包)

本文提供了一份详细的TIA Portal V17教程,指导如何实现S7-1200 PLC与HMI的联合仿真开发。通过抢答器项目实例,涵盖从环境搭建、PLC编程到HMI设计的全流程,帮助工程师高效完成工业自动化系统的虚拟调试,显著提升开发效率。

weixin_30417487的博客 630

完全背包问题,原理剖析,公式推导,OJ详解

如何从O(nm^2)到O(n^m)?

EQUINOX1的博客 3599

从零开始使用matlab实现EKF-SLAM算法(含完整代码)

扩展卡尔曼滤波器同步定位与建图 (EKF-SLAM) 算法建立在 EKF 的基础上,集成了 EKF 的功能,可解决机器人技术中最具挑战性的问题之一:同时定位与建图 (SLAM)。 EKF-SLAM采用EKF方法来同时估计机器人的状态和周围环境的布局,而无需事先了解位置。 这种双重功能对于在未知环境中运行的自主系统至关重要,使它们能够在绘制区域地图时有效导航。 EKF-SLAM 算法一直是自动驾驶车辆和机器人系统开发的基石,为处理现实世界环境中固有的不确定性提供了一个强大的框架。

mjmmm的博客 6635

散户渡劫指南:从炼气期到化神期的量化之路

经常有人问我普通人怎么学习量化交易,我就在想怎么学了量化就不是普通人了吗,可能他的意思是类比修仙,量化素人如何修炼进阶,今天就将量化学习每个阶段均对标修仙境界的核心能力与心法要诀一一介绍,助你从“交易凡人”蜕变为“量化金仙”。

木头大左的博客 1338

完全背包问题

完全背包问题的详解,包括问题描述,分析,解法推导与代码实现

每行代码都热烈滚烫。 807

71.qt quick-可伸展菜单-抽屉栏示例 通用QML界面(一键换肤)

特点: 支持动态添加item、删除item、自适应界面 附带添加删除、展开等动画 同时支持qwidget、qml加载 支持number提示(比如消息数量等) 侧边抽屉栏支持动画伸展 支持换肤、拖拽、最大化等

抵抗时间扭曲,坚持做一件有意义的事 5286

【背包dp----完全背包】-----Money System / Cow Cash G【完全变种---求方案数】

dp[i][j]表示从前 i 个物品中任选若干个(可重复选),使得它们的总价值恰好为 j 的方案总数。dp[j]表示:当前处理到第 i 个物品时,总价恰好为 j 的方案数。含义不变:表示从前i个物品中选出若干个,使得总价值恰好为j的组合方式数量。

2401_82676816的博客 968

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

P1474 Money System / Cow Cash G【洛谷算法习题】

核心逻辑:将问题转化为完全背包组合方案计数,通过一维DP数组正序转移实现无限选取,外层枚举货币保证组合不重复计数,最终f[N]即为总方案数。关键操作:完全背包正序遍历、组合数顺序去重、初始边界f[0]=1。效率保障:线性递推无冗余计算,万级规模下运行极快。

Pretty Boy Fox的博客 334

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

动态规划之完全背包

完全背包适用于权重有限,物品可以使用无限次,使用的是贪心思想。

jtss123的博客 396

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

P1474 [USACO2.3]Money System / [USACO07OCT]Cow Cash G题解

P1474 [USACO2.3]Money System / [USACO07OCT]Cow Cash G题解 题目传送门 分析: 这道题我们看到货币能无限使用就能够像到这是一道完全背包求方案数问题 我们先设一个ddd数组,did_idi​表示凑成iii的方案数 然后我们就只要考虑一个初始化的问题 因为他只有凑满了iii才能算一种方案,我们就可以就是将d0d_0d0​初始化为1 动态转移方程就很容易推出来了 did_idi​=max(di−w[i]d_{i-w[i]}di−w[i]​+1,did_idi​

FKJDASOI的博客 339

常用算法代码模板与题单 | E - 动态规划(更新于2026.10.7)

这篇文档其实是我自己学习路上的一份“复习笔记”。之前看了不少教程,零零散散记了一堆代码片段和小技巧,时间久了就容易忘,翻起来也麻烦。所以干脆花时间整理了一下,把常用的模板、容易踩的坑、还有一些个人觉得挺实用的小技巧都归到了一起。 如果你也在学类似的东西,或许能帮你省下一些翻找的时间;如果有哪里写得不清楚或不对,也欢迎随时指正交流。 希望这份整理也能对你有一点点帮助~ ✨

团爸讲算法 299

动态规划的问题总结

动态规划

ziqi9216的博客 260

洛谷 普及/提高- DP 习题复习(二)

P5520 [yLOI2019] 青原樱 组合数学题目。 A(n,m)= n * ( n - 1 ) * ( n - 2 ) * ... *( n - m + 1) C(n,m) = A(n,m)/ m ! 本题考察插空法。推出公式ans=A(n-m+1 , m);直接算 P5662 [CSP-J2019] 纪念品 完全背包的变形,T天的股票每天的购进和第二天的卖出价格之差,作为物品的利润(val),每天股票的价...

qq_49620160的博客 1256

洛谷刷题7.7

本文摘要整理了5道洛谷编程题的解题思路和代码实现: P2622关灯问题II:使用BFS求最短路,状态用01数组表示并通过位运算转换 P1336最佳课题选择:采用部分背包动态规划求解最优方案 P1474货币系统:完全背包问题求方案数 P1141迷宫:BFS优化技巧,记录访问时间和块大小映射 P8673迷宫与陷阱:广搜时需记录坐标和剩余无敌步数 还包含P12323阶乘求和的数学解法,注意到40!后9位为0的特性。各题均给出了简洁的C++代码实现,涉及BFS、动态规划、位运算等算法技巧。

2301_80100359的博客 479

刷题题单...

【洛谷】P2884 [USACO07MAR] Monthly Expense S / 【信息学奥赛一本通】1243:月度开销 | AC:2。【洛谷】P1068 [NOIP 2009 普及组] 分数线划定 / 【信息学奥赛一本通】1180:分数线划定 | AC:2。【洛谷】P1009 [NOIP 1998 普及组] 阶乘之和 / 【信息学奥赛一本通】1173:阶乘和 | AC:2。【洛谷】P1451 求细胞数量 / 【信息学奥赛一本通】1329:【例8.2】细胞 | AC:2。

写代码的犄角旮瘩 248

动态规划DP之背包问题2---完全背包问题

这些状态是问题的解的一部分,它们包含了问题的关键信息,可以帮助我们描述问题的结构,并且可以通过状态之间的转移来推导出最优解。(很多人不理解该状态转移,理解过程如上DP分析所示,从最开始暴力解决开始分析,再依次优化,动态规划问题虽然代码看着简单,但是要理解其中原理和状态转移过程)接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 种物品的体积和价值。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。

weixin_63001635的博客 1641

完全背包及其优化

问题描述 有N种物品和一个容量为V 的背包,每种物品都有无限件可用。放入第i种物品的费用是wi,价值是vi。求解:将哪些物品装入背包,可使这些物品的耗费的费用总和不超过背包容量,且价值总和最大。 算法思想 朴素思想 完全背包与01背包不同的是同一种物品可多次选取。有了01背包的基础,再来理解完全背包就很容易了。 先回顾一下01背包的状态转移方程: j<w(i) V(i,j)=V(i-1,j) j>=w(i) V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+

永远相信美好的事情即将发生 2171

完全背包问题(动态规划)

完全背包问题 题目: 有 N 种物品和一个容量为 V 的背包,每种物品都有无限件可用。第 i 种物品的费用是 c[i],价值是 w[i] 。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 一、验证动态规划求解的可行性 这个问题可以不可以像01背包问题一样使用动态规划来求解呢?来证明一下即可。 首先,先用反证法证明最优化原理: 假设完全背包...

但行好事,莫问前程 6143

动态规划之背包问题(01背包,完全背包,多重背包,分组背包)

动态规划的各种背包问题(01、完全、多重、分组)附有代码和复杂度解析

fansv587的博客 2203
上一篇: SSL 1276 石子合并 (动态规划 01背包)
下一篇: P1439 【模板】最长公共子序列 (最长不下降序列 (单调队列优化))
.SAI.
博客等级 码龄5年 835粉丝 63原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值