• 9.8 给定数量不限的硬币,25,10,5,1,编写代码计算n分有几种表示法。


    思路:对于可以选择的面值(面值比num都大,当然不可选),一次选择0次~最多选择的次数,然后递归下去,子函数只能从后面的货币开始选。

    import java.util.ArrayList;
    import java.util.List;
    
    public class Solution {
    
        int[] money = { 25, 10, 5, 1 };
    
        public List<List<Integer>> wayOfChange(int num) {
            List<List<Integer>> res = new ArrayList<List<Integer>>();
            List<Integer> tmp = new ArrayList<Integer>();
            wayOfChangeRec(res, tmp, num, 0);
            return res;
        }
    
        private void wayOfChangeRec(List<List<Integer>> res, List<Integer> tmp, int num, int start) {
            if (num < 0)
                return;
            if (num == 0) {
                res.add(new ArrayList<Integer>(tmp));
                return;
            }
            // 从start开始寻找可以继续添加的元素
            int i = start;
            while (i < money.length && num < money[i])
                i++;
            if (i >= money.length)
                return;
            // 计算当前面值最多可以用几次
            int times = num / money[i];
            // 依次选择0次,1次,2次...times次
            for (int k = 0; k <= times; k++) {
                for (int j = 0; j < k; j++)
                    tmp.add(money[i]);
                // 递归向下,后面只能从后面的面值开始选
                wayOfChangeRec(res, tmp, num - k * money[i], i + 1);
    
                for (int j = 0; j < k; j++)
                    tmp.remove(tmp.size() - 1);
    
            }
    
        }
    
        public static void main(String[] args) {
            System.out.println(new Solution().wayOfChange(9));
        }
    }
  • 相关阅读:
    关于异步IO与同步IO的写操作区别
    慢慢开始记录一些技术心得吧
    写了placement new就要写placement delete
    关于针对class自定义new操作符失败的函数处理
    operator->和operator->*
    关于继承中的拷贝构造函数
    关于g++编译模板类的问题
    关于互斥锁,条件变量的内核源码解析
    关于sigwait
    观察者设计模式
  • 原文地址:https://www.cnblogs.com/jdflyfly/p/3931845.html
Copyright © 2020-2023  润新知