codevs 3961 硬币找零完全背包DP/记忆化搜索
Posted Roni
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codevs 3961 硬币找零完全背包DP/记忆化搜索相关的知识,希望对你有一定的参考价值。
在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从银行拿回最少的硬币数,并保证能用这些硬币发工资。 我们应该注意到,人民币的硬币系统是100,50,20,10,5,2,1,0.5,0.2,0.1,0.05,0.02,0.01 元,采用这些硬币我们可以对任何一个工资数用贪心算法求出其最少硬币数。但不幸的是:我们可能没有这样一种好的硬币系统,因此用贪心算法不能求出最少的硬币数,甚至有些金钱总数还不能用这些硬币找零。例如,如果硬币系统是40,30,25 元,那么37元就不能用这些硬币找零;95元的最少找零硬币数是3。又如,硬币系统是10,7,5,1元,那么12 元用贪心法得到的硬币数为3,而最少硬币数是2。
你的任务就是:对于任意的硬币系统和一个金钱数,请你编程求出最少的找零硬币数;如果不能用这些硬币找零,请给出一种找零方法,使剩下的钱最少。
第1 行,为N 和T,其中1≤N ≤50 为硬币系统中不同硬币数;1≤T≤100000 为需要用硬币找零的总数。
第2 行为N 个数值不大于65535 的正整数,它们是硬币系统中各硬币的面值。
如T 能被硬币系统中的硬币找零,请输出最少的找零硬币数。
如T 不能被硬币系统中的硬币找零,请输出剩下钱数最少的找零方案中的最少硬币数。
4 12
10 7 5 1
2
青铜水题
【题意】:题意:先输入n和m,下一行输入n种硬币,每一种都有一个面值。 问组成m所需要的最少的硬币数量.完全背包问题。 虽然题目中涉及到可不可以组成,可以的时候,如同第一组数据,最小硬币数为2、 不能组成的时候,如同第二组数据,补充现有硬币面值的个数,看达到m时最小的数量
【代码】:
#include<cstdio> #include<cstring> #include<queue> #include<iostream> #include<stack> #define maxn 100005 #define maxm 505 #define INF 0x3f3f3f3f #define ll long long using namespace std; int a[55]; int dp[maxn]; int main() { int n,m; while(cin>>n>>m) { for(int i=1;i<=n;i++) cin>>a[i]; for(int i=0;i<=m;i++) dp[i]=INF; dp[0]=0; for(int i=1;i<=n;i++){ for(int j=a[i];j<=m;j++){ dp[j]=min(dp[j],dp[j-a[i]]+1); } } printf("%d\n",dp[m]); } }
以上是关于codevs 3961 硬币找零完全背包DP/记忆化搜索的主要内容,如果未能解决你的问题,请参考以下文章
1716: [Usaco2006 Dec]The Fewest Coins 找零钱
dp背包问题/01背包,完全背包,多重背包,/coin change算法求花硬币的种类数