E (1204) : 找零钱
Submit Page Summary Discussion Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 38 Solved: 17
Description
现有100,50,20,10,5,2,1元的纸币,现在一个物品价值n元,问至少需要多少张钱,才可以支付该物品。
Input
输入多组数据,每组第一行输入整数n(1≤n≤9999)。
Output
输出至少需要的钱的张数,并输出方案(输出格式:币值*
张数+币值*
张数+….=n,币值从大到小输出,其中张数为1则无需乘以张数)
Sample Input
6 1 1000
Sample Output
2 5+1=6 1 1=1 10 100*10=100
这是一道我当时做不出来的题目
当时主要是不知道如何输出需要的钱的方案
可能是自己的算法思维还不够成熟吧
还是要多多训练和培养算法思维
//尽可能用面值大的纸币找零,就能保证所用总钱币数最少。
//
//具体说来,就是:先用面值为100的纸币找零,直到剩下需要找零的钱剩下不到100元,再用面值为50的纸币找零,直到剩下需要找零的钱剩下不到50元...以此类推,直到剩下需要找零的钱剩0元。
//
//只要把总钱数对100取余数(n%100),就能得到用100元纸币找零之后所剩下的钱,且一共用了(n/100)张100元的纸币。以此类推。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int ch[] = {100, 50, 20, 10, 5, 2, 1}, n, i, sum[10]; //sum:各面额的钱的总数
while (~scanf("%d", &n))
{
int n0 = n; //保存n原本的值,备用
for (i = 0; i < 7; i++)
{
sum[i] = n / ch[i];
n %= ch[i];
}
int tot = 0;
for (i = 0; i < 7; i++)
tot += sum[i];
printf("%d ", tot);
n = n0;
for (i = 0; i < 7; i++)
{
if (sum[i] > 0)
{
if (sum[i] == 1)
printf("%d", ch[i]);
else
printf("%d*%d", ch[i], sum[i]);
n -= sum[i] * ch[i];
if (i < 6 && n > 0)
printf("+");
}
}
printf("=%d\n", n0);
}
return 0;
}