钱币

HDU3348--coins(贪心+思维)

余生长醉 提交于 2020-01-24 18:51:34
题意: 你有面值为1,5,10,50,100的钱币分别若干张;求购买某一价值的物品所花的最少和最多钱币数。 思路: (1)最少的钱币数: 由于面值分别为1,5,10,50,100;大面值都可以由小面值凑数转化而来,故贪心策略适用,从大面值开始枚举,每次取当前能取的最大面值。 (2)最多的钱币数: 此时采用贪心策略不再成立了,因为若从小面值开始枚举,当前的最优解并不一定是全局的最优解了。(i.e. 商品价值为6,你有2张1,1张5,此时若按贪心策略,你先把1取完,还要凑4,但是你已经没有1,只剩下一张5了;但其实明明可以取1张1,1张5达到目标的),这是因为当前最优状态不能转移下去了,故可以采用DP做,也可以采用逆向思维继续用贪心,我要用出去最多,即我要剩下的最小,即对于总价值为(sum-price),求最小的钱币数,这就转化为(1)的问题了,最后总数减掉求出的剩下的最小钱币数就是用出的最大钱币数。 代码如下: # include <cstdio> # include <cstring> # include <algorithm> using namespace std ; typedef long long ll ; int main ( ) { int i , j ; int n , m ; int t ; ll a [ 10 ] ; //a[i]为每个价格对应的钱币的数量;

上机实验3--钱币兑换问题

旧巷老猫 提交于 2019-12-11 12:50:12
//上机实验题3 -- 钱币兑换问题 #include<stdio.h> void fun(int n){ int x,y,z; int count = 0; for(z=0;z<=n/5;z++){ //5分钱币的的个数 0 ——n/5 for(y=0;y<=(n-5*z)/2;y++){ //2分钱币的个数 0 —— (n-5*z)/2 x = n - 5*z - 2*y; printf("\n兑法%d: ",++count); if(z != 0) printf("5分硬币%d个 ",z); if(y != 0) printf("2分硬币%d个 ",y); if(x != 0) printf("1分硬币%d个",x); } } printf("\n共有%d种兑法",count); } int main(){ int n = 10; fun(n); return 0; }    来源: https://www.cnblogs.com/Hqx-curiosity/p/12021801.html

HDU 1284 钱币兑换问题(普通型 数量无限的母函数)

匿名 (未验证) 提交于 2019-12-03 00:41:02
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1284 钱币兑换问题 Problem Description 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。 Input 每行只有一个正整数N,N小于32768。 Output 对应每个输入,输出兑换方法数。 Sample Input 2934 12553 Sample Output 718831 13137761 Author SmallBeer(CML) Source 杭电ACM集训队训练赛(VII) 分析: 母函数分为两类 普通型求组合数:数量有限普通型,数量无限普通型 指数型求排列数 本题: 数量无限的普通型母函数: 模板题 自己对母函数的研究还很浅,只会套这种简单模板。。 加油,多刷题 code: #include<bits/stdc++.h> using namespace std; typedef long long ll; #define max_v 32768 int c1[max_v]; int c2[max_v]; int main() { for ( int i= 0 ;i<max_v;i++ ) { c1[i] = 1 ; c2[i] = 0 ; } for ( int i= 2 ; i<= 3 ; i++ )

hdu1284――钱币兑换问题

匿名 (未验证) 提交于 2019-12-03 00:29:01
在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。 Input 每行只有一个正整数N,N小于32768。 Output 对应每个输入,输出兑换方法数。 Sample Input 2934 12553 Sample Output 718831 13137761 背包问题方案数,有点像爬楼梯问题 代码: #include <cstdio> #include <algorithm> using namespace std ; const int MAXN= 40000 ; long long f[MAXN]; int main( void ){ int a[]={ 1 , 2 , 3 }; int n; f[ 0 ]= 1 ; for ( int i= 0 ;i< 3 ;i++){ for ( int j=a[i];j<MAXN;j++){ f[j]+=f[j-a[i]]; } } while (~ scanf ( "%d" ,&n)){ printf ( "%lld\n" ,f[n]); } return 0 ; } 文章来源: hdu1284――钱币兑换问题