硬币找零(coin)

硬币找零(coin)

本题为南阳理工学院第四届华为杯校赛A组的B题。

当时在比赛时我和我的队友用的背包(动态规划)做的,后来发现还有一个贪心的想法。

题目:

  • 内存限制:128MB 时间限制:1s Special Judge: No

题目描述:

  Karter 是 Alfredo 镇的一家杂货店店主。由于商品物美价廉,Alfredo 镇的居民十分喜欢到 Karter 的杂货店去买东西。 

  随着杂货店的销量逐渐增加,一件事情逐渐开始困扰着 Karter,那就是:找零钱。 

  Alfredo 镇的硬币分为以下几种: 

  • cent: 价值 1 分   

  • nickel: 价值 5 分   

  • dime: 价值 10 分  

  • quarter: 价值 25 分  

  为了减少麻烦,Karter 总是采用尽可能少的硬币来完成找零(假设每种硬币 Karter 都有 足够多个)。由于 Karter 的数学并不好,他找到了擅长编程的你。你能帮他编写程序,解决 这个问题吗?  

  例如,要找零 32 分,只需要 1 枚 quarter,1 枚 nickel 和 2 枚 cent 共 4 枚硬币即可完成 找零。  

 

输入描述:

第一行一个整数 T (1 ≤ T ≤ 1000),表示测试用例的组数。
每组测试用例占一行,包含一个整数 n (1 ≤ n ≤ 1000),表示需要找零的数额(单位:分)。

输出描述:

对于每组测试用例,请在一行内按以下格式输出硬币总数最少的找零方案:

a quarter(s), b dime(s), c nickel(s), d cent(s)

其中,a, b, c, d 分别表示找零中 quarter, dime, nickel 和 cent 的数量。
输入数据保证硬币总数最少的找零方案是唯一的。

样例输入:

3
1
32
75

样例输出:

0 quarter(s), 0 dime(s), 0 nickel(s), 1 cent(s)
1 quarter(s), 0 dime(s), 1 nickel(s), 2 cent(s)
3 quarter(s), 0 dime(s), 0 nickel(s), 0 cent(s)

比赛时的AC代码:

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <queue>
#include <stack>
#include <stdlib.h>
using namespace std;
int n,t;
int dis[1001],dp[1001];
int coin[4]={25,10,5,1};
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        int i,j;
        memset(dp,0,sizeof(dp));
        memset(dis,0,sizeof(dis));
        memset(dp,0,sizeof(dp));
        scanf("%d",&n);
        int ll;
        int la;
        for(i=0;i<=3;i++)
        {
            if(coin[i]<=n)
            {
                 ll=coin[i];
                 la=i;
                 break;

            }
        }
        for(i=la;i<4;i++)
        {
            for(j=ll;j<=n;j++)
            {
                if(dp[j-coin[i]]+coin[i]>dp[j])
                {
                    dp[j]=dp[j-coin[i]]+coin[i];
                    if(dp[j]>dp[j-1])
                    {
                        dis[i]++;
                        if(dis[i]==1&&ll==coin[i])
                            continue;
                        else
                          ll+=coin[i];
                    }
                    if(dp[n]==n)
                         break;
                }
            }
        }
            printf("%d quarter(s), %d dime(s), %d nickel(s), %d cent(s)\n",dis[0],dis[1],dis[2],dis[3]);
    }
    return 0;
}

 贪心思维:

每次只需要选择不超过剩余数额的最⼤⾯额的硬币找零,直到选出的硬币总价值等于需要找零的数额即可。

AC代码:

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <queue>
#include <stack>
#include <stdlib.h>
using namespace std;
int main()
{
    int T,n;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        int x=n/25;
        n%=25;
        int y=n/10;
        n%=10;
        int z=n/5;
        n%=5;
         printf("%d quarter(s), %d dime(s), %d nickel(s), %d cent(s)\n",x,y,z,n);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值