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