硬币找零(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;
}