码迷,mamicode.com
首页 > 其他好文 > 详细

codevs 3961 硬币找零【完全背包DP/记忆化搜索】

时间:2018-04-27 02:28:48      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:应该   财务   data   nbsp   str   com   好的   esc   方案   

题目描述 Description

    在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从银行拿回最少的硬币数,并保证能用这些硬币发工资。 我们应该注意到,人民币的硬币系统是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。 

    你的任务就是:对于任意的硬币系统和一个金钱数,请你编程求出最少的找零硬币数;如果不能用这些硬币找零,请给出一种找零方法,使剩下的钱最少。 

 

输入描述 Input Description

    第1 行,为N 和T,其中1≤N ≤50 为硬币系统中不同硬币数;1≤T≤100000 为需要用硬币找零的总数。 

    第2 行为N 个数值不大于65535 的正整数,它们是硬币系统中各硬币的面值。 

 

输出描述 Output Description

    如T 能被硬币系统中的硬币找零,请输出最少的找零硬币数。 

    如T 不能被硬币系统中的硬币找零,请输出剩下钱数最少的找零方案中的最少硬币数。 

 

样例输入 Sample Input

    4 12 

    10 7 5 1

 

样例输出 Sample Output

    2

数据范围及提示 Data Size & Hint

青铜水题

【题意】:题意:先输入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/记忆化搜索】

标签:应该   财务   data   nbsp   str   com   好的   esc   方案   

原文地址:https://www.cnblogs.com/Roni-i/p/8955351.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!