洛谷 NOIP AT3880 Coins 题解

本文介绍了一种解决特定硬币组合问题的算法实现。该问题要求计算出总价值为X的日元组合数目,其中可用的硬币面额包括500日元、100日元和50日元,每种面额的数量限制分别为A、B和C。通过三层循环模拟所有可能的组合,筛选出符合条件的组合,并统计其数量。

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

题目

有一个坑,题目下方事例,数量为0的就没有输出。我以为为0的就不用输出,特意加了判断。结果有4道题WA,去掉了那个判断才AC/


### 翻译如下
你有500日元硬币A枚、100日元硬币B枚、50日元硬币 C枚。 现在,从这些硬币中挑出数枚硬币,各个硬币价格之和刚好等于X日元的组合有多少种。 需要注意的是:
1. 同种类(面值)的硬币是没有区别的
2. 不同的组合方式以某个面值的硬币数量不同来区分
3. 0 ≤ A, B, C ≤ 50
4. A + B + C ≥ 1
5. 50 ≤ X ≤ 20,000
6. A, B, C 一定是整数

7. X 一定是50的倍数

输入格式
A枚500日元硬币
B枚100日元硬币
C枚50日元硬币
组合价值之和等于X元

输出格式
组合的方式个数

### 题解
其实题看懂了,就好做了

需要注意的是,不要N^2了,分分钟超时。后面要加个判断,当前循环已经超了就不用继续模拟了。这样可以减到N²/2
#include <stdio.h>

int main ()
{
    int a, b, c, x, i, j, k, cnt=0;
    scanf("%d%d%d%d", &a, &b, &c, &x);
    for (i=0; i <= a && 500*i<=x; i++)
    {
        for (j=0; j <= b && 100*j+500*i<=x; j++)
        {
            for (k=0; k <= c && 50*k+100*j+500*i<=x; k++)
            {
                if (500*i+100*j+50*k==x)
                {
                    cnt++;
                }
            }
        }
    }

    printf("%d", cnt);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值