1. 问题描述
Z国的货币系统包含面值1元、4元、16元、64元共计4种硬币,以及面值1024元的纸币。现在小Y使用1024元的纸币购买了一件价值为N的商品,请问最少他会收到多少硬币?
1.1 输入描述
一行,包含一个数N。
1.2 输出描述
一行,包含一个数,表示最少收到的硬币数。
2. 思路描述
动态规划问题,设
f
(
x
)
f(x)
f(x)为凑出x元所需的最少硬币数,则状态转移方程为
f
(
x
)
=
M
I
N
{
f
(
x
−
1
)
+
1
,
f
(
x
−
4
)
+
1
,
f
(
x
−
16
)
+
1
,
f
(
x
−
64
)
+
1
}
f(x)=MIN\{f(x-1)+1,f(x-4)+1,f(x-16)+1,f(x-64)+1\}
f(x)=MIN{f(x−1)+1,f(x−4)+1,f(x−16)+1,f(x−64)+1}
3. 代码实现
import java.util.HashMap;
import java.util.Scanner;
public class test{
private static int min(int a,int b){
return a>b? b:a;
}
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int[] dp=new int[n+1],coins=new int[4];
coins[0]=1;
coins[1]=4;
coins[2]=16;
coins[3]=64;
for(int i=0;i<=n;i++){
dp[i]=i;
for(int j=0;j<4;j++){
if(i>=coins[j]){
dp[i]=min( dp[i-coins[j]]+1 , dp[i] );
}
}
System.out.println("i: "+i+" dp[i]: "+dp[i]);
}
}
}