array={5,2,3},有5元、2元、3元的若干张,求能组成20元的最少的张数。
dp[i][j]=min(dp[i-1][j],dp[i][j-array[i]]+1);
public static void main(String[] args){
int[] array={5,2,3};
System.out.println(min(array,20));
}
public static int min(int[] array,int sum){
if(array==null || array.length<1||sum<1){
return -1;
}
int n=array.length;
int max=Integer.MAX_VALUE;
int[][] dp=new int[n][sum+1];
for(int j=1;j<sum+1;j++){
dp[0][j]=max;
if(j-array[0]>=0&&dp[0][j-array[0]]!=max){
dp[0][j]=dp[0][j-array[0]]+1;
}
}
for(int i=1;i<n;i++){
for(int j=1;j<sum+1;j++){
int left=max;
if(j-array[i]>=0&&dp[i][j-array[i]]!=max){
left=dp[i][j-array[i]]+1;
}
dp[i][j]=Math.min(left, dp[i-1][j]);
}
}
return dp[n-1][sum]!=max?dp[n-1][sum]:-1;
}