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 }
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 }

浙公网安备 33010602011771号