挑战程序设计——硬币问题 II

本文介绍了一种解决硬币找零问题的算法,通过输入不同面额硬币的数量及需支付金额,输出所需最少硬币数量。该算法采用贪心策略从大到小选择合适的硬币进行支付。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有 1,5,10,50,100,5001,5,10,50,100,500 元的硬币,分别为 C_1, C_5, C_{10}, C_{50}, C_{100}, C_{500}C1​,C5​,C10​,C50​,C100​,C500​ 个。现在使用这些硬币来支付 AA 元,最少需要多少个硬币?本题保证至少存在一种支付方案

输入

  • 第一行整数 T(1 \leq T \leq 10000)T(1≤T≤10000),表示有 TT 组测试数据
  • 每组测试数据占两行:
    • 第一行,66 个整数,分别表示 C_1, C_5, C_{10}, C_{50}, C_{100}, C_{500}C1​,C5​,C10​,C50​,C100​,C500​
    • 第二行,11 个整数,表示 AA
    • 0 \leq C_i \leq 10^90≤Ci​≤109
    • 0 \leq A \leq 10^90≤A≤109

输出

  • 输出 TT 行,每行一个整数,表示每组测试数据中,需要的最少硬币数

样例 1

输入

1
3 2 1 3 0 2
620

输出

6
#include<bits/stdc++.h>
using namespace std;
int k[7];
int c[6]={1,5,10,50,100,500};
int T,A;
int main()
{
    cin>>T;
    while(T--)
    {
        int count=0;
        for(int i=0;i<6;i++)
            cin>>k[i];
        cin>>A;
        for(int i=5;i>=0;i--)
        {
            int t=min(A/c[i],k[i]);
            A-=t*c[i];
            if(A>=0)
            {
                count+=t;
                continue;
            }
            else
                break;
            
        }
        cout<<count<<endl;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值