洛谷 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;
}

### 关于 NOIP2015 神奇的幻方解题思路 对于神奇的幻方问题,在给定题目条件下,需要构建一个满足特定条件的三阶幻方矩阵。该矩阵每一行、列以及两条对角线上的三个数之和都相等。 #### 构建幻方的关键点在于: - 幻方中心位置固定为 `n/2` 的值加一(即 `(N*N+1)/2`),其中 N 是矩阵大小[^2]。 - 填充顺序遵循一定的规律:第一个数字放置在中间列最上方;后续每一个新数字按照右上方斜向移动填充原则进行安排;如果越界则折返到另一端继续填入;当遇到已占用格子时,则向下移一位再放入当前数值。 ```cpp #include <iostream> using namespace std; int main() { int n; cin >> n; // 输入幻方维度 if (n % 2 == 0 || n <= 0) { cout << "仅支持正整数且为奇数的情况"; return -1; } int magic[n][n]; for(int i = 0;i<n;i++) for(int j=0;j<n;j++)magic[i][j]=0; int row = 0, col = n / 2; for (int num = 1; num <= n * n;) { if (row == -1 && col == n) { // 右上角溢出处理 row += 2; col--; } else { if (col == n) col -= n; // 列超出范围调整 if (row < 0) row += n; // 行超出范围调整 } if (!magic[row][col]) { magic[row][col] = num++; row--; col++; // 移动至下一个待填写的位置 } else { row += 2; col--; continue; } } // 输出结果 for (int i = 0; i < n; ++i){ for (int j = 0; j < n; ++j) printf("%d ", magic[i][j]); printf("\n"); } } ``` 此代码实现了基于上述逻辑创建任意奇数维的幻方,并打印出来。注意这里特别针对输入做了校验,只接受正值奇数作为合法输入尺寸。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值