题目描述 :

现有N元钱,兑换成小额的零钱,有多少种换法?币值包括1 2 5分,1 2 5角,1 2 5 10 20 50 100元。

(由于结果可能会很大,输出Mod 10^9 + 7的结果)

输入描述:

第一行输入一个整数T,代表有T组数据

接下来T行,每行输入1个数N,N = 100表示1元钱。(1 <= N <= 100000)

输出描述:

输出Mod 10^9 + 7的结果

样例输入

2

5

4

样例输出

4

3

首先考虑一下状态。用dp[i][j]表示使用 i 枚硬币去拼凑 j 元的所有可行方案数。

那么这个状态和哪些状态相关呢?

dp[i][j]既然表示用 i 枚硬币拼凑 j 元的可行方案数,它可以来源于用 i - 1 枚硬币拼凑某一个价格 t ,再加上一枚价值 t 的硬币即可。

也即是说我们可以用一层去循环枚举所有的硬币种类。但是要注意,我们需要把所有的可选硬币的方案全部加起来。

增加的这枚硬币可能是第一个,显然也可能是第二个,并且这是两中不同的方案。

到这里状态转移方程就显而易见了

dp[i][j] += dp[i-1][ j-arr[i] ];//arr[i]是第 i 枚硬币的面值

关于dp数组的初始化问题,其实很简单,因为用 0 枚硬币只能拼凑 0 元,而且只有一种方案,所以dp[0][0] = 1;其余初始化为 0 即可。

还可以很容易的发现dp[i][j]只和上一层dp[i-1]的某一个值相关联,所以可以用dp[j]表示上一层的状态,计算当前状态时直接调用上一层的状态,计算完成后当前状态保存到数组中,对于下一层而言,当前状态就是上一层状态,这样又实现了一个从二维到一维数组的转换。

代码如下

#include

using namespace std;

int dp[110000];

int n, t;

const int mod = 1e9 + 7;

int arr[] = { 0,1,2,5,10,20,50,100,200,500,1000,2000,5000,10000 };

int main() {

dp[0] = 1;

for (int i = 1; i <= 13; i++) {

for (int j = arr[i]; j <= 100000; j++) {

dp[j] += dp[j - arr[i]];

dp[j] %= mod;

}

}

while (cin >> t) {

while (t--) {

cin >> n;

cout << dp[n] << endl;

}

}

return 0;

}

java零钱兑换dp_兑换零钱(DP)相关推荐

  1. java字符串匹配dp_[OI]字符串DP小结

    顾名又思义,是在字符串上进行的DP操作.因为字符串本身可以看作是一个序列,所以有些时候字符串DP可以用区间DP来解决. P2246 SAC#1 - Hello World(升级版) 题目描述 在讲义的 ...

  2. 完全背包问题Leecode322零钱兑换和Leecode518零钱兑换||

    文章目录 Leecode 322零钱兑换 Leecode 518零钱兑换II Leecode 322零钱兑换 题目大意 给你一个整数数组 coins ,表示不同面额的硬币:以及一个整数 amount ...

  3. JAVA微信企业付款到零钱(十分钟搞定),附完整DEMO下载

    最近帮朋友做了一个简单的微分销系统,实现从企业付款到零钱分润的功能,简单记录一下微信提现功能开发的流程, 主要就是按规则封装好请求参数调用微信接口,涉及一些签名校验: A.接口流程 获取用户OPENI ...

  4. 凑零钱问题_凑零钱的组合

    给定K种面值c1,c2,....ck,每种金币数量,例举总和为amount的,至少需要的金币的组合 关于计算金币数量有解法,金币组合方式可以参考,暴力解,从小到大,找到即是最小组合 import ja ...

  5. python换零钱_Python算法之零钱兑换问题的解法

    比如:顾客购物买37元东西,给了100元,要找63元,那最少数量就是1张50元,1张10元,3张1元,一共4张. 方法一: 贪心策略 解决这个问题,最直观的就是使用贪心策略.我们会从最大面值的钱开始, ...

  6. 【必备算法】动态规划:LeetCode题(六)322. 零钱兑换,518. 零钱兑换 II

    322. 零钱兑换² 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: ...

  7. 51Nod-1101 换零钱【0/1背包+DP】

    1101 换零钱 基准时间限制:1秒 空间限制:131072KB 分值:20难度:3级算法题 N元钱换为零钱,有多少不同的换法?币值包括1 2 5分,1 2 5角,1 2 5 10 20 50 100 ...

  8. 用Java计算100元兑换10元,5元,1元纸币的方法

    在数学中,我们肯定学过概率论,用概率公式算出事情出现的概率,以及会发生多少种方案,现在我们就用Java去实习概率事件 源代码: public static void main(String[] arg ...

  9. python找零钱_Python递归 - 找零钱

    特殊的方法-循环: #无法解决某些情况,例如存在21元的零钱 def fun(n): count = 0 while n > 25: n = n - 25 count = count + 1 w ...

最新文章

  1. python list 的乘法
  2. Layman’s explanation of SAP IS Retail concepts: assortments and listing
  3. 《智能网联汽车技术路线图 2.0》重磅发布
  4. mysql数据采集中间件_开源 | MySQL数据传输中间件—DTLE
  5. 概述---《TCP/IP协议》卷一
  6. Visual SourceSafe 数据库安全性简介
  7. 99%的程序员都在用Lombok,原理竟然这么简单?我也手撸了一个!|建议收藏
  8. 求职简历介绍html5模板
  9. Android ViewPager + Fragment的布局
  10. springboot 2.x 集成 drools 7.x
  11. Downloading SRA data using command line utilities
  12. 由先序+后序遍历确定序列是否唯一并输出一个中序序列
  13. 感受MapXtreme2004之二
  14. 货币转换python代码_[Python3 练习] 003 货币转换
  15. 山西最新五大姓氏排名发布,排名第一的是王,第二的竟是……
  16. Golang使用 阿里云OSS存储
  17. Python爬虫入门教程 97-100 帮粉丝写Python爬虫之【shuan色球预测前置条件】
  18. 中国移动国际mCloud如何助力企业乘风破浪?
  19. UE全景图,碰到the outpout directory时的问题
  20. android水印相机,Android 水印相机开发

热门文章

  1. ERP(企业资源管理计划)通过奇门对接WMS(仓库管理系统)
  2. skyline v6 三维学习软件
  3. java rollback用法,junit/spring-test @Rollback的使用
  4. Nginx中文域名配置
  5. 赵小楼《天道》《遥远的救世主》深度解析(60)芮小丹的独立意识与丁元英的尊重
  6. 大学英语听说教程4听力原文及答案
  7. 介绍 spring Alibaba Sentinel: 分布式系统的流量防卫兵
  8. 除了SVN,还可以使用的文档管理工具--TFS; 使用VS2010连接TFS的使用说明和简单操作手册
  9. 一个宝藏开源软件,跨平台终端神器 Tabby
  10. 编码器的分类、作用、线制及其接线方法—基础补充