DP硬币组合问题

时间:2019-09-15
本文章向大家介绍DP硬币组合问题,主要包括DP硬币组合问题使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

问题描述:有5种面值分别为1,5,10,25,50面值的硬币,现输入非负整数s,要求选用硬币,使得选用的硬币最少,且刚好能组合成价值为s的数量。

解:此题采用动态规划来做,如果输入的硬币数量少于5,我们只能采用面值为1的数量。如果s为6,则有两种方案。方案1:全部采用面值为1的硬币数。方案2:

采用一个硬币为1的,一个硬币为5的,此时硬币数量刚好为2。我们把这5种面值存放到一个数组中,记录为type。dp[i]表示的意思是s等于i时,所用的最少硬币的数量。

第一步:先初始化dp;使每一个dp[i]都为整数中最大的值即为inf;

递推式:dp[i]=min(dp[i],dp[i-type[y]+1]),y表示面值中的下标。

for(int j=0;j<5;j++)

  for(int i=type[j];i<money;i++)

    dp[i]=min(dp[i],dp[i-type[j]]+1)

注意:i是是从type[j]开始的,表示money小于type[j]的不用再考虑。

 1 import java.util.Scanner;
 2 
 3 public class 最少硬币问题 
 4 {
 5     static int Money=251;
 6     static int value=5;
 7     static int[] type={1,5,10,25,50};
 8     static int[] Min=new int[Money];
 9     static int inf=Integer.MAX_VALUE;
10     static void solve()
11     {
12         for(int k=0;k<Money;k++)
13             Min[k]=inf;
14         Min[0]=0;
15         for(int j=0;j<value;j++)
16             for(int i=type[j];i<Money;i++)
17                 Min[i]=Math.min(Min[i], Min[i-type[j]]+1);
18     }
19     public static void main(String[] args) 
20     {
21         // TODO 自动生成的方法存根
22         Scanner sc=new Scanner(System.in);
23         int s=sc.nextInt();
24         solve();
25         System.out.println(Min[s]);
26     }
27 
28 }
View Code
 1 import java.util.Scanner;
 2 
 3 public class 最少硬币问题 
 4 {
 5     static int Money=251;
 6     static int value=5;
 7     static int[] type={1,5,10,25,50};
 8     static int[] Min=new int[Money];
 9     static int inf=Integer.MAX_VALUE;
10     static void solve()
11     {
12         for(int k=0;k<Money;k++)
13             Min[k]=inf;
14         Min[0]=0;
15         for(int j=0;j<value;j++)
16             for(int i=type[j];i<Money;i++)
17                 Min[i]=Math.min(Min[i], Min[i-type[j]]+1);
18     }
19     public static void main(String[] args) 
20     {
21         // TODO 自动生成的方法存根
22         Scanner sc=new Scanner(System.in);
23         int s=sc.nextInt();
24         solve();
25         System.out.println(Min[s]);
26     }
27 
28 }

原文地址:https://www.cnblogs.com/ybc7/p/11524071.html