美团笔试题(一)-[编程题] 拼凑钱币

本文介绍了一道编程题——拼凑钱币。题目要求利用六种不同面额的纸币组合成任意金额的方法数。文章详细解析了动态规划解决该问题的过程,并提供了完整的Java代码实现。

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

[编程题] 拼凑钱币

给你六种面额 1、5、10、20、50、100 元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0~10000的非负整数)的不同组合的个数。

输入描述:

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

输出描述:

输出一个整数,表示不同的组合方案数

输入例子1:

1

输出例子1:

1

分析:其中假设所有的钱币总数为 V=V0,V1,V2,,ViV=V0,V1,V2,…,Vi。总共有 ii 种钱币。我们用 dp[i][n] 表示用 i 种钱币表示组成 n 元的组合数。我们依次分析12元以内的硬币组合数量。

当我们只使用1种硬币的时候,所有的组合情况如下:

使用硬币数1234567891011
只使用111111111111
1和511112222233
1、5和1011112222244

依次往下。

当我们增加一种硬币(硬币5)的时候,组合的结果相对于只使用1来说是,在原有只有1的统计基础上行,增加 1 个5元硬币输出的组合情况 + 增加2个5元硬币输出得组合情况 + … + 直到增加到最大的 5 元硬币数量为止。就如具体的取n=10n=10来说明。

当我们新增加一个5元硬币时,使用硬币5的所有次数取值范围为 0,1,20,1,2。其中 2=max[n5]2=max[n5]

我们分情况来考虑:

  1. 当使用0个5元时,就是上面用1组成数字n的情况;
  2. 当时用1个5元时,就是上面用1组成数字n-5的情况;
  3. 当使用2个5元时,就是上面用1组成数字n-2*5的情况。

所以,当使用1和5两种硬币表示数字n=10的时候,就是讲上面的所有情况累加dp[2][10]=dp[1][10]+dp[1][5]+dp[1][0]dp[2][10]=dp[1][10]+dp[1][5]+dp[1][0]。总结成通用的公式就如下所示

dp[i+1][n]=i=0kdp[i][ni×vi+1]k=0,1,,max[n/vi+1]dp[i+1][n]=∑i=0kdp[i][n−i×vi+1]k=0,1,…,max[n/vi+1]

代码实现如下:

public class Solution {
    static int[] values = {1,5,10,20,50,100};
    static int combine(int n) {
        n++; // 主要是需要多增加一个为0的时候空位,不然会出错
        int[][] dp = new int[values.length][n];
        for (int i = 0; i < n; i++) {
            dp[0][i] = 1;
        }
        for (int i = 1; i < values.length; i++) {
            for (int j = 0,k; j < n; j++) {
                k = j/values[i];
                while(k>=0){
                    dp[i][j] += dp[i-1][j-k*values[i]];
                    k--;
                }
                System.out.print(dp[i][j]+"\t");
            }
            System.out.println();
        }
        return dp[values.length-1][n-1];
    }
    public static void main(String[] args){
        System.out.println(combine(20));
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值