有n种硬币,面分别值为X1,...,Xn,每种都有无限多。给定非负整数S,可选用多少个硬币,使得面值之和恰好为S?输出硬币的最小数
package task4;
import java.util.Vector;
public class coinProblem {
public static void dpMin(int S,int c){
numMin.addElement(S);
System.out.println("S:"+S);
if (ok==0){
if(S<=0){
ok=1;
System.out.println("最少需要硬币数:"+c);
}else for(int i=countMin.length-1;i>=0;i--){
if(S>=coin_value[i]&&ok==0){
dpMin(S-coin_value[i],c+1);
}
}
}
}
static int coin_value[]=new int[3],countMin[]=new int[3],ok=0;
static Vector numMin= new Vector();
public static void main(String[] args){
coin_value[0]=3;coin_value[1]=9;coin_value[2]=10;
coinProblem coin=new coinProblem();
//最少硬币数
ok=0;
coin.dpMin(33,0);
if ((Integer) numMin.lastElement()!=0){
System.out.println("No answer");
}else{
int right=numMin.size()-1;
int left=(numMin.size()-2);
for(int i=numMin.size()-1;i>=0;i--){
int L=(Integer) numMin.elementAt(left);
int R=(Integer) numMin.elementAt(right);
if (L>R){
// System.out.println("l-r:"+(L-R)+"left:"+left+"right:"+right);
for(int k=0;k<coin_value.length;k++){
if (coin_value[k]==(L-R))
countMin[k]++;
}
if (left>0)
{right=left;left--;}
else if(left==0)
break;
}else{
if (left>0)
left--;
}
}
}
for (int i=0;i<countMin.length;i++)
System.out.print(countMin[i]+" ");
}
}
运行结果如下:
S:33
S:23
S:13
S:3
S:0
最少需要硬币数:4
1 0 3