其他分享
首页 > 其他分享> > 2022-6-16 真题练习

2022-6-16 真题练习

作者:互联网

MT13 拼凑面额   warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。

描述

给你六种面额 1、5、10、20、50、100 元的纸币,假设每种币值的数量都足够多,编写程序求组成 n 元的不同组合的个数。   数据范围: 0 \le n \le 10000 \0≤n≤10000  ,保证 n 是整数

输入描述:

输入为一个数字N,即需要拼凑的面额

输出描述:

输出也是一个数字,为组成N的组合个数。
 1 import java.util.*;
 2 public class Main{
 3     public static void main(String[] args){
 4         Scanner sc=new Scanner(System.in);
 5         int n=sc.nextInt();
 6         long[][] dp=new long[n+1][6];
 7         int[] coins={1,5,10,20,50,100};
 8         for (int i=0;i<=n;i++){
 9             for (int j=0;j<6;j++){
10                 if (j==0||i==0) dp[i][j]=1;
11                 else if (i-coins[j]>=0){
12                     dp[i][j] = dp[i][j - 1] + dp[i - coins[j]][j];
13                 }else dp[i][j]=dp[i][j-1];
14             }
15         }
16         System.out.print(dp[n][5]);
17     }
18 }

思路1:dp[i][j]表示i面值用了前j种硬币,二维动态规划。

用了第j种硬币或者不用

dp[i][j] = dp[i][j - 1] + dp[i - coins[j]][j];
边界条件为只有第一种硬币肯定为1或者面额0肯定为1
或者用不了j种相当于前j-1种
 1 import java.util.*;
 2 public class Main{
 3     public static void main(String[] args){
 4         Scanner sc=new Scanner(System.in);
 5         int n=sc.nextInt();
 6         int[] dp=new int[n+1];
 7         int[] coins={1,5,10,20,50,100};
 8         dp[0]=1;
 9         for (int i=0;i<6;i++){
10             for (int j=1;j<=n;j++){
11                 if (j-coins[i]>=0) dp[j]+=dp[j-coins[i]];
12             }
13         }
14         System.out.print(dp[n]);
15     }
16 }

思路2:把硬币种类循环放在外面,防止重复的情况,比较简单。

标签:Scanner,16,int,coins,System,2022,new,真题,dp
来源: https://www.cnblogs.com/benbicao/p/16381177.html