找换硬币问题 与 0-1背包问题区别

之所以再写一篇Blog,是因为现实中很多问题都可以转化成“找换硬币”问题 和 “0-1”背包问题。因此,需要细细理解。

其次,在“参考资料”中汇总关于 贪心算法与动态规划的一些Blog及学习资料。

区别:

其实最大的区别就是:找换硬币问题中的 某类硬币 是可以多次选择的。而对于0-1背包问题,某物品要么选,要么不选,选了之后,它就“没了”。当然,有0-1背包问题的变形--完全背包问题--某(某类)物品有多个,可重复选。

第二,就是选择的权衡。0-1背包问题,还有个价值属性,在选择的时候,是考虑价值的最大化。重量相当于 cost, 而价值则是 value.

而对于 找硬币,则没有这么复杂。从这点看,找换硬币问题要简单一些。但是它聚焦于 用更少的硬币。所以 在考虑其他问题时,判断它是关注价值的最大化呢,还是 关注 最少数目。

参考资料:

部分背包问题的贪心算法正确性证明

某种 找换硬币问题的贪心算法的正确性证明

从 活动选择问题 看动态规划和贪心算法的区别与联系

求解两个字符串的最长公共子序列

给定一个整数,求解该整数最少能用多少个Fib数字相加得到

《背包九讲》

https://www.zhihu.com/question/23995189  知乎上关于动态规划思想的讨论

时间: 2025-01-06 01:10:08

找换硬币问题 与 0-1背包问题区别的相关文章

某种 找换硬币问题的贪心算法的正确性证明

一,问题介绍 最近一直在看贪心算法的正确性证明(如何证明贪心算法获得的解一定是最优解),感觉“剪枝”技巧用得比较多.再看了下<算法导论>中贪心算法一章里面的一个练习---找换硬币问题.这个问题对于某些 面值的硬币 是有最优解的,故记录下其中的一些证明思路. 考虑用最少的硬币数 来找 n 分钱的问题,假设每个硬币的值都是整数. 如果可换的硬币的单位是 c 的幂,也就是 c0,c1,... ,ck ,其中整数 c>1,k>=1 证明贪心算法总可以产生一个最优解. 二,找换硬币的贪心策略

换硬币

设有n种不同的硬币,各个硬币的面值存在数组w[i]中,现在要用这些硬币来找钱,可以使用各种面值的硬币的个数存于数组s[i]中,设计一个用最少硬币找钱的m的方法. package 换硬币; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner; public class Main { public static void main(Strin

换硬币问题

[问题] 想兑换100元钱,有1,2,5,10四种钱,问总共有多少兑换方法. const int N = 100; int dimes[] = {1, 2, 5, 10}; int arr[N+1] = {1}; int coinExchange(int n) //动态规划 { int i, j; for (i = 0; i < sizeof(dimes)/sizeof(int); i++) { for (j = dimes[i]; j <= n; j++) arr[j] += arr[j-d

poj1029(找假硬币)模拟

题意:给n个硬币,其中有一个硬币和其他的硬币重量不一样,给出k次比较重量的结果.问是否可以将假硬币找出来. 解法:判断一个硬币是真币的方法(满足其一): 1.这个硬币出现过在=的两边 2.既出现在小于的一边过,也出现在大于的一边过. 如果排除这些硬币后只剩下一个,那么假币就是剩下的那个,否则就是不确定. 代码: /**************************************************** * author:xiefubao *********************

动态规划算法求解0,1背包问题

首先我们来看看动态规划的四个步骤: 1. 找出最优解的性质,并且刻画其结构特性: 2. 递归的定义最优解: 3. 以自底向上的方式刻画最优值: 4. 根据计算最优值时候得到的信息,构造最优解 其中改进的动态规划算法:备忘录法,是以自顶向下的方式刻画最优值,对于动态规划方法和备忘录方法,两者的使用情况如下: 一般来讲,当一个问题的所有子问题都至少要解一次时,使用动态规划算法比使用备忘录方法好.此时,动态规划算法没有任何多余的计算.同时,对于许多问题,常常可以利用其规则的表格存取方式,减少动态规划算

7、Cocos2dx 3.0游戏开发找小三之3.0版本的代码风格

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27691337 Cocos2d-x代码风格 前面我们已经多次提到 Cocos2d-x 源自于 Cocos2d-iPhone.Cocos2d-iPhone 是一个十分出色的游戏引擎,许多优秀的 iOS平面游戏都基于 Cocos2d-iPhone 开发,而它的实现语言是 Objective-C.因此,Cocos2d-x 也就沿袭了 Objective-C 的

8、Cocos2dx 3.0游戏开发找小三之3.0版本的内存管理

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27693365 复杂的内存管理 移动设备上的硬件资源十分有限,内存尤为宝贵,开发者必须十分慎重地利用内存,避免不必要的消耗,更要防止内存泄漏. 基于 Cocos2d-iPhone 的 Objective-C风格的内存管理是 Cocos2d-x 的一个特色. 把 Objective-C 的内存管理方式引入 C++,使得游戏开发的内存管理难度下降了个层次.

背包问题:0/1背包问题 普通背包问题(贪心算法只适用于普通背包问题)

//sj和vj分别为第j项物品的体积和价值,W是总体积限制. //V[i,j]表示从前i项{u1,u2,…,un}中取出来的装入体积为j的背包的物品的最大价值. 第一种:0/1背包问题 最大化 ,受限于  1)若i=0或j=0,  V[i,j] = 0 2)若j<si, V[i,j] = V[i-1,j] 3)若i>0且j>=si, V[i,j] = Max{V[i-1,j],V[i-1,j-si]+vi} 第二种:背包问题:在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部

0/1背包问题(回溯法)

回溯法是一个既带有系统性又带有跳跃性的搜索算法.它在包含问题的所有解的解空间树中,按深度优先策略,从根结点出发搜索解空间树.算法搜索至解空间树的任意一结点时,先判断该结点是否包含问题的解.如果肯定不包含,则跳过对该结点为根的子树搜索,逐层向其祖先结点回溯:否则 ,进入该子树,继续按深度优先策略搜索. 问题的解空间 用回溯法解问题时,应明确定义问题的解空间.问题的解空间至少包含问题的一个(最优)解.对于 n=3 时的 0/1 背包问题,可用一棵完全二叉树表示解空间,如图所示: 求解步骤 1)针对所