硬币找零-记忆化搜索(DP动态规划)

硬币找零

时间限制:1000 ms  |  内存限制:65535 KB

难度:3

描述

在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从银行拿回最少的硬币数,并保证能用这些硬币发工资。

我们应该注意到,人民币的硬币系统是 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 的正整数,它们是硬币系统中各硬币的面值。

当n,t同时为0时结束。

输出
输出数据:

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

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

样例输入
4 12
10 7 5 1
样例输出
2
这道题目的思路与矩形嵌套有点类似,首先大家可以想到的是要想得到最少的找零硬币数肯定需要知道每一种情况,好,这样可以通过解答树将所有的情况列举出来,但是这样明显会超时,因为情况太多,而且有很多重复的子计算,所以既然要知道每一种情况,用DFS遍历,然后运用记忆化搜索的思想剪枝,将已经得到答案的最小硬币数直接返回不再重复计算
其中dp[i]代表着将i分解成硬币,最少能分成多少个。
/*
Problem: NYOJ(南阳理工OJ)
Author :2486
Memory: 1012 KB		Time: 192 MS
Language: C/C++		Result: Accepted
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=100000+5;
const int INF=0x3f3f3f3f;
int n,t,a[maxn],dp[maxn],Min;
int dfs(int s) {
    if(s<0)return INF;
    if(dp[s]!=-1)return dp[s];
    Min=min(s,Min);
    int ans=INF;
    for(int i=0; i<n; i++) {
        ans=min(dfs(s-a[i])+1,ans);//得到最少硬币数
    }
    if(ans!=INF)dp[s]=ans;
    return ans;
}
int main() {
    while(~scanf("%d%d",&n,&t),n&&t) {
        for(int i=0; i<n; i++) {
            scanf("%d",&a[i]);
        }
        memset(dp,-1,sizeof(dp));
        dp[0]=0;
        Min=INF;
        dfs(t);
        if(dp[t]==-1) {//是否可以找零
            dfs(t-Min);
            printf("%d\n",dp[t-Min]);//如果不能,进行再次递归
        } else {
            printf("%d\n",dp[t]);
        }
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-01 07:44:56

硬币找零-记忆化搜索(DP动态规划)的相关文章

hdu 4960 记忆化搜索 DP

Another OCD Patient Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 490    Accepted Submission(s): 180 Problem Description Xiaoji is an OCD (obsessive-compulsive disorder) patient. This morni

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

题目描述 Description 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从银行拿回最少的硬币数,并保证能用这些硬币发工资. 我们应该注意到,人民币的硬币系统是100,50,20,10,5,2,1,0.5,0.2,0.1,0.05,0.02,0.01 元,采用这些硬币我们可以对任何一个工资数用贪心算法求出其最少硬币数.但不幸的是:我们可能没有这样一种好的硬币系统,因此用贪心算法不能求出最少的硬币数,甚至有些金钱总数还不能用这些硬币

hdu1331&amp;&amp;hdu1579记忆化搜索(DP+DFS)

这两题是一模一样的``` 题意:给了一系列递推关系,但是由于这些递推很复杂,所以递推起来要花费很长的时间,所以我要编程序在有限的时间内输出答案. w(a, b, c): 如果a,b,c中有一个值小于等于0,那么w(a, b, c)的值为1 如果a,b,c中有一个值大于20,那么w(a, b, c)的值为w(20, 20, 20) 如果a<b<c,那么w(a, b, c)=w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c) 否则w(a, b, c)=w(a-

HDU 1078 FatMouse and Cheese(记忆化搜索DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078 题目大意:一个n*n的图,每个点都有奶酪,老鼠从(0,0)开始走,每次最多只能走k步就要停下来,停下的这个位置的奶酪数只能比上一个停留的位置大,并获取其奶酪,每次只能水平或垂直走,问最多能得到的奶酪. 解题思路:记忆化搜索,这方面还是写的太少,还要看别人才会,这个就当个例子参考吧. 1 #include<cstdio> 2 #include<cstring> 3 #include

HDU 1978 How many ways(第一道记忆化搜索+DP)

How many ways Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4610    Accepted Submission(s): 2726 Problem Description 这是一个简单的生存游戏,你控制一个机器人从一个棋盘的起始点(1,1)走到棋盘的终点(n,m).游戏的规则描述如下: 1.机器人一开始在棋盘的起始点并

HNU OJ10086 挤挤更健康 记忆化搜索DP

挤挤更健康 Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users: 339, Accepted users: 216 Problem 10086 : No special judgement Problem description 用边长小于N的正方形方砖(注意,不要求所有的方砖大小相同,请看样例说明)不重叠地铺满N*N的正方形房间,最少要几块方砖. Input 第一行是一个整

记忆化搜索+dp(洛谷1514 引水入城2010noip提高组)

在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. 为了使居民们都尽可能饮用到清澈的湖水,现在要在某些城市建造水利设施.水利设施有两种,分别为蓄水厂和输水站.蓄水厂的功能是利用水泵将湖泊中的水抽取到所在城市的蓄水池中. 因此,只有与湖泊毗邻的第1 行的城市可以建造蓄水厂.而输水站的功能则是通过输水管线利用高度落差,将湖水从高处向低处输送.故一座城市能建造输水站

BZOJ2246 [SDOI2011]迷宫探险 【记忆化搜索dp + 概率】

题目 输入格式 输出格式 仅包含一个数字,表示在执行最优策略时,人物活着走出迷宫的概率.四舍五入保留3位小数. 输入样例 4 3 3 2 .$. A#B A#C @@@ 143 37 335 85 95 25 223 57 输出样例 0.858 提示 题解 毒瘤dp题 我们设\(f[x][y][s][h]\)表示从点\((x,y)\)出发,所有陷阱状态为\(s\),生命值为\(h\),存活的期望概率 我们枚举邻点,选择存活概率最大的作为当前\(f\)的值 除了墙,有以下情况: ①如果是空地或者终

阿牛的EOF牛肉串-记忆化搜索或动态规划

C - 阿牛的EOF牛肉串 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2047 Description 今年的ACM暑期集训队一共有18人,分为6支队伍.其中有一个叫做EOF的队伍,由04级的阿牛.XC以及05级的COY组成.在共同的集训生活中,大家建立了深厚的友谊,阿牛准备做点什么来纪念这段激情燃烧的岁月,想了一想,阿牛从家里拿来