- 浏览: 1653764 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (405)
- C/C++ (16)
- Linux (60)
- Algorithm (41)
- ACM (8)
- Ruby (39)
- Ruby on Rails (6)
- FP (2)
- Java SE (39)
- Java EE (6)
- Spring (11)
- Hibernate (1)
- Struts (1)
- Ajax (5)
- php (2)
- Data/Web Mining (20)
- Search Engine (19)
- NLP (2)
- Machine Learning (23)
- R (0)
- Database (10)
- Data Structure (6)
- Design Pattern (16)
- Hadoop (2)
- Browser (0)
- Firefox plugin/XPCOM (8)
- Eclise development (5)
- Architecture (1)
- Server (1)
- Cache (6)
- Code Generation (3)
- Open Source Tool (5)
- Develope Tools (5)
- 读书笔记 (7)
- 备忘 (4)
- 情感 (4)
- Others (20)
- python (0)
最新评论
-
532870393:
请问下,这本书是基于Hadoop1还是Hadoop2?
Hadoop in Action简单笔记(一) -
dongbiying:
不懂呀。。
十大常用数据结构 -
bing_it:
...
使用Spring MVC HandlerExceptionResolver处理异常 -
一别梦心:
按照上面的执行,文件确实是更新了,但是还是找不到kernel, ...
virtualbox 4.08安装虚机Ubuntu11.04增强功能失败解决方法 -
dsjt:
楼主spring 什么版本,我的3.1 ,xml中配置 < ...
使用Spring MVC HandlerExceptionResolver处理异常
问题描述:
People in Silverland use square coins. Not only they have square shapes but also their values are square numbers. Coins with values of all square numbers up to 289 (=172), i.e., 1-credit coins, 4-credit coins, 9-credit coins, ..., and 289-credit coins, are available in Silverland.
There are four combinations of coins to pay ten credits:
ten 1-credit coins,Your mission is to count the number of ways to pay a given amount using coins of Silverland.
one 4-credit coin and six 1-credit coins,
two 4-credit coins and two 1-credit coins, and
one 9-credit coin and one 1-credit coin.
Input
The input consists of lines each containing an integer meaning an amount to be paid, followed by a line containing a zero. You may assume that all the amounts are positive and less than 300.Output
For each of the given amount, one line containing a single integer representing the number of combinations of coins should be output. No other characters should appear in the output.Sample Input
2 10 30 0
Sample Output
1 4 27
问题分析:
这个问题是个典型的动态规划问题,从底往上推就行了。
这个问题的关键是建立递推式:
二维数组w,其中w[i][j]代表使用<=i*i的币值的钱币来付款j元钱的的可能的方法数
这样我们对w[i][j]来构造递推式:
w[i][j] = sum { w[i-1][j-k*i*i] } 其中k=0,1,... j-k*i*i >= 0
这个个含义是使用<=i*i的币值的钱币付j元钱的方法数,就是我用0...k个i*i币值来
替换掉以前用<=(i-1)*(i-1)币值的等额的钱 来付j元钱的方法数。而用i*i替换出等
额钱的方法数,其实就是用<=(i-1)*(i-1)币值的钱来付j-k*i*i的方法数。
理解这个公式也就很容易理解代码了。
cpp 代码
- #include<iostream></iostream>
- using namespace std;
- int w[18][301];
- void NumOfMethod(){
- int i,j,k;
- /*初始化w的值,用<=1币值显然有一种方法,j=0初始化为1的原因是,
- w[i][j] += w[i-1][j-k*i*i],如果j-k*i*i == 0,即用k个币值为
- i*i的硬币恰好可以替换所有的所有的硬币来支付,这个方法数是1而不是0,
- 这比较特殊,与用<=(i-1)*(i-1)币值的钱来付j-k*i*i的方法数不相等*/
- for(i = 1; i < 18; i++)
- for(j = 0; j < 301; j++){
- if(i == 1 || j == 0)
- w[i][j] = 1;
- else
- w[i][j] = 0;
- }
- //下面就是从底往上推的一个过程了:
- for(i = 2; i < 18; i++)
- for(j = 1; j < 301; j++)
- for(k = 0; j-k*i*i >= 0; k++)
- w[i][j] += w[i-1][j-k*i*i];
- }
- int main(){
- int n;
- NumOfMethod();
- while(cin>>n,n){
- cout << w[17][n] << endl;
- }
- return 0;
- }
当然如果想节省空间可以用两个一维的数组交替使用来替换掉w那个二维数组。
评论
1 楼
fuliang
2007-12-17
初始化w的值,用<=1币值显然有一种方法,j=0初始化为1的原因是,w[i][j] += w[i-1][j-k*i*i],如果j-k*i*i == 0,即用k个币值为i*i的硬币恰好可以替换所有的所有的硬币来支付,这个方法数是1而不是0,这比较特殊,与用<=(i-1)*(i-1)币值的钱来付j-k*i*i的方法数不相等(当然也可以认为支付0元的方法为1)
发表评论
-
二分查找之变型题目
2010-10-24 12:40 2158二分查找算法在各个公司的笔试面试题大量出现,通常不是简单一眼就 ... -
一道笔试题(创新工厂)解法
2010-10-21 17:44 1855一个帖子http://www.iteye.com/topic/ ... -
[zz]大数据量,海量数据 处理方法总结
2010-08-27 22:24 2273大数据量的问题是很多面试笔试中经常出现的问题,比如baidu ... -
Trie and suffix array
2010-04-13 20:54 1927字典数Trie和后缀数组suffix array是处理字符串操 ... -
金币问题
2009-11-09 08:41 2018今年某公司的笔试题: 一个矩阵地图,每一个元素值代表金币数, ... -
楼梯问题
2009-11-09 08:19 1577hl给我的几道某公司的算法题: 1、 有个 100 级的 ... -
一道考察模拟乘法的题目
2009-11-07 22:37 1422今天hl和我讨论一道题目: 写道 整形数组如a={1,4, ... -
链表归并
2009-11-07 21:40 1038以前gx同学问的某某公司的笔试题,写一下练练(纯手写,没编译过 ... -
找出出现次数超过一半的数字
2009-11-07 21:23 1891hl同学问我一道这个题,想了一种方法,感觉还是不错的,只扫描一 ... -
有道难题以超低分晋级
2009-06-10 11:36 1568有道难题比赛居然晋级了,可以领到一个t-shirt。 -
逆序数/逆序数对
2009-06-09 23:17 3785逆序数是个常遇到的问题,主要有两种解法: O(n^2)的方法: ... -
有道难题topcoder
2009-05-31 23:55 2461今天做了有道topcoder的题目,也是第一次在topcode ... -
百度之星第一场题目
2009-05-31 00:03 3654由于不符合参赛条件,未能参加百度之星,看了题目还挺有意思,把题 ... -
一个对字符串很好的Hash函数ELFHHash
2009-05-03 21:41 2282#include<stdio.h> #defin ... -
最大流Ford-Fulkerson算法
2009-04-22 17:33 9687算法导论对最大流算法有很详细的介绍,今天实现了最大流Ford- ... -
大数/高精度加减乘除取模[收藏]
2009-04-16 19:38 5068#include <iostream> #i ... -
带重复数字的全排列
2009-04-16 18:58 3894上次gx同学问我一道又重复数字的全排列的问题,我当时用set保 ... -
差分约束系统
2009-04-15 16:00 3747(本文假设读者已经有以下知识:最短路径的基本性质、Bellma ... -
二分图匹配
2009-04-15 15:40 3730二分图最大匹配的匈牙利算法 二分图是这样一个图,它的顶点可以分 ... -
线段树
2009-03-24 10:58 1688把问题简化一下: 在自然数,且所有的数不大于30000的 ...
相关推荐
本课件主要通过一个经典的硬币找零问题来介绍DP的基本概念和应用。 在DP入门中,我们首先面临的问题是:给定一系列不同面值的硬币(如1, 5, 10, 20, 50, 100)以及一个目标金额,我们需要找到最少使用多少枚硬币来...
在这个硬币问题中,我们可以创建一个二维数组dp,其中dp[i][j]表示前i个硬币中能组成总价值j的最小重量。初始状态下,dp[0][0]为0,表示没有硬币时重量为0。 接下来,我们遍历所有的硬币,对于每个硬币,我们有两种...
在计算机科学领域,"钱币组合方法数的问题"是一个经典的动态规划问题,通常出现在算法分析与设计的课程中。这个问题涉及到如何计算使用不同面值的钱币来组成特定金额的所有可能组合方式。在这里,我们将深入探讨这个...
首先,我们要了解“零钱兑换”问题的背景:给定一个非负整数n(代表金额)和一个数组coins(代表面额),目标是找到有多少种不同的方法可以凑成这个n,其中每种方法都由数组coins中的面额组成。这个问题可以被视为...
coins-security-1.0jar包
标题 "donut2_Fifa_coins_" 暗示了我们正在讨论的是一款与FIFA游戏相关的项目,可能是一个自动购买FIFA游戏内货币(Coins)的程序或工具。FIFA游戏是由Electronic Arts (EA)开发的一款全球知名的足球模拟游戏系列,...
在这个钱币组合问题中,我们可以设立一个二维数组dp,其中dp[i][j]表示用前i种钱币组成j元的方法数。初始状态下,当j=0时,任何钱币都无法组成0元,所以dp[0][0] = 1;同样地,当i=0时,没有钱币可用,无论金额是...
对于硬币组合问题,我们可以定义一个动态规划数组dp[i],表示使用1分、2分和5分硬币组成i分的不同方法数。初始状态为dp[0] = 1(不使用任何硬币就是一种组合)。然后对于每个硬币面值,我们可以更新dp数组,如果当前...
1. **初始化**:定义一个`dp`数组,其中`dp[i]`表示凑成金额`i`所需要的最小硬币数。初始情况下,除了`dp[0]=0`外,其他值均设置为一个较大的数(这里设置为`amount+1`)。 2. **计算最少硬币数**:通过两层循环...
根据提供的文件信息,可以看出这份文档并非关于《2019 Standard Catalog of World Coins, 2001-Date, 13th edition》的内容,而是关于一个特定软件或系统的功能需求文档。由于文档内容与标题及描述不相符,这里将...
给定不同面额的硬币coins和一个总金额amount,编写一个函数来计算可以凑成总金额所需的最少硬币个数。如果无法凑出指定金额,则返回-1。 **问题分析:** 这道题的关键在于找到一个最优化的方法来组合硬币以达到目标...
硬币兑换问题: 给定总金额为A的一张纸币,现要兑换成面额分别为a1,a2,….,an的硬币,且希望所得到的硬币个数最少。 # 动态规划思想 dp方程式如下 # dp[0] = 0 # dp[i] = min{dp[i - coins[j]] + 1}, 且 其中 i >=...
在这个问题中,我们可以创建一个二维数组dp,其中dp[i][j]表示用前i种面额的硬币组成金额j的组合数。 首先,初始化dp数组,dp[0][0]为1,表示没有使用任何硬币时,有1种组合(即金额为0)。对于每一种面额的硬币,...
对于硬币找钱问题,我们可以创建一个数组dp,其中dp[i]表示组成金额i所需的最少硬币数。 以下是C++代码的一个简要框架: ```cpp int coinChange(vector<int>& coins, int amount) { vector<int> dp(amount + 1, ...
在这个问题中,我们可以创建一个二维数组dp,其中dp[i][j]表示用前i种钱币凑出j元钱的最少硬币数量。初始化时,dp[0][j] = ∞(无穷大),因为没有使用任何钱币无法凑出任何金额;dp[i][0] = 0,因为不需凑出0元钱。...
在这个问题中,我们可以定义一个二维数组`dp`,其中`dp[i][j]`表示使用前`i`种面值的硬币组成`j`元的最小硬币数量。初始状态`dp[0][0]`为0,因为不使用任何硬币就无法组成任何金额。对于`dp[i][j]`,我们可以有两种...
在这个问题中,我们可以创建一个二维数组dp,其中dp[i][j]表示使用前i种硬币可以组成j元钱的组合数。初始化时,dp[0][0] = 1,因为不使用任何硬币时,组成0元钱有一种方法,即不选任何硬币。对于每个硬币面值,我们...
在这个问题中,我们将通过递归地解决找零的子问题,逐步构建一个全局最优解。 **问题定义**: - 设 `dp[i]` 为找零 `i` 面额所需的最少硬币数。 - 对于每一种硬币面值 `t`(`t` 在 `T` 中),我们考虑用 `Coins[t]`...
在这个问题中,我们可以定义一个数组dp,其中dp[i]表示组成i元所需要的组合数。初始状态为dp[0]=1,表示组成0元的组合数为1(即不使用任何硬币)。然后,我们可以遍历所有硬币的面额,更新dp数组,最终dp[10^n]就是...
在这个代码中,我们首先定义了一个硬币面值的数组`coins`,然后创建了一个动态规划数组`dp`,用于存储到达每个目标金额所需的最小硬币数。`dp[0]`初始化为0,表示没有金额不需要任何硬币。接下来,我们通过两个嵌套...