首页 > 试题广场 >

拼凑钱币

[编程题]拼凑钱币
  • 热度指数:8900 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给你六种面额 1、5、10、20、50、100 元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0~10000的非负整数)的不同组合的个数。

输入描述:
输入包括一个整数n(1 ≤ n ≤ 10000)


输出描述:
输出一个整数,表示不同的组合方案数
示例1

输入

1

输出

1
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println(getTotal(scanner.nextInt()));
    }


    private static long getTotal(int money) {

        long total = 0L;

        for (int num = 0; num <= money; num += 50) {

            // 求解 100x + 50y = num  非负整数解的个数
            int z1 = (num / 50) / 2 + 1;

            int v20 = (money - num) / 20;

            for (int k = 0; k <= v20; k++) {

                // 求解 10x + 5y <= v1andv5andV10  非负整数解的个数
                int v1andv5andV10 = money - num - 20 * k;

                int tmp = (v1andv5andV10 / 5);
                long kkkk = tmp / 2 + 1;
                long z2 = (tmp + 2-kkkk) * kkkk;

                total = total + z1 * z2;
            }

        }

        return total;
    }
}





不用质疑,这是个正确的答案,也是比较容易理解的答案。 内存消耗也应该是最优的,因为没有使用数组。运行速度也应该还可以, money/50 * money/20 次 循环运算。
money<= 353583 都能正常运行。
编辑于 2019-07-12 18:02:29 回复(0)