2240. 买钢笔和铅笔的方案数

难度: 中等
来源: 每日一题 2023.09.01

给你一个整数 total ,表示你拥有的总钱数。同时给你两个整数 cost1cost2 ,分别表示一支钢笔和一支铅笔的价格。你可以花费你部分或者全部的钱,去买任意数目的两种笔。

请你返回购买钢笔和铅笔的 不同方案数目

示例 1:

输入:total = 20, cost1 = 10, cost2 = 5
输出:9
解释:一支钢笔的价格为 10 ,一支铅笔的价格为 5 。
- 如果你买 0 支钢笔,那么你可以买 0 ,1 ,2 ,3 或者 4 支铅笔。
- 如果你买 1 支钢笔,那么你可以买 0 ,1 或者 2 支铅笔。
- 如果你买 2 支钢笔,那么你没法买任何铅笔。
所以买钢笔和铅笔的总方案数为 5 + 3 + 1 = 9 种。

示例 2:

输入:total = 5, cost1 = 10, cost2 = 10
输出:1
解释:钢笔和铅笔的价格都为 10 ,都比拥有的钱数多,所以你没法购买任何文具。所以只有 1 种方案:买 0 支钢笔和 0 支铅笔。

提示:

  • 1 <= total, cost1, cost2 <= 106
class Solution {
    public long waysToBuyPensPencils(int total, int cost1, int cost2) {
    }
}

分析与题解


  • 枚举

    这个题目整体思路比较清楚, 所以是一道简单的Leetcode题目.

    我们首先假设能买钢笔的数量最大为 maxPen , 会有如下情况.

    • 0 支钢笔, 剩余的钱可以买 0, 1, ... , (total - 0 * cost1)/cont2 支铅笔

    • 1 支钢笔, 剩余的钱可以买 0, 1, ... , (total - 1 * cost1)/cont2 支铅笔

    • 2 支钢笔, 剩余的钱可以买 0, 1, ... , (total - 2 * cost1)/cont2 支铅笔

    • ...

    • maxPen 支钢笔, 剩余的钱可以买 0, 1, ... , (total - maxPen * cost1)/cont2 支铅笔

    这样我们只需要遍历最大钢笔数量 maxPen, 然后内部依次添加铅笔的购买数量, 也就是方案数即可.

    整体的解题思路如下所示.

    class Solution {
        public long waysToBuyPensPencils(int total, int cost1, int cost2) {
            int maxPen = total/cost1;
            long result = 0;
            for(int i = 0; i <= maxPen; i++) {
                int subTotal = total - cost1 * i;
                int pencilMaxCount = subTotal/cost2;
                result += (pencilMaxCount + 1);
            }
            return result;
        }
    }
    

    复杂度分析:

    • 时间复杂度: O(n), 需要一次长度为 maxPen 的遍历过程.
    • 空间复杂度: O(1),常量级别的空间开辟

    结果如下所示.


IT界无底坑洞栋主 欢迎加Q骚扰:676758285