package 笔试;import java.util.Scanner;publicclass 最小钱币方案问题 {staticint RMB[]={1,2,5,10,20,50,100};publicstaticvoidmain(String[] args){// TODO Auto-generated method stub
Scanner in=newScanner(System.in);while(in.hasNext()){int n=in.nextInt();int res[][]=f(n);while(n>0){
System.out.println(res[1][n]);
n=n-res[1][n];}}}privatestaticint[][]f(int n){// TODO Auto-generated method stubint s[][]=newint[2][n+1];
s[0][0]=0;for(int i =1; i <=n; i++){int q=n;int k=0;for( k =6; k >=0&&RMB[k]>n; k--);// 找到最大的可找零钱的下标for(int j =0; j <=k; j++){if(i>=RMB[j]&&q>=1+s[0][i-RMB[j]]){
q=1+s[0][i-RMB[j]];
s[1][i]=RMB[j];}}
s[0][i]=q;}return s;}}
#include<stdio.h>#include<iostream>#define N 60intexchage(float n,float*a,int c,float*r);voidmain(){float rmb[]={100,50,20,10,5,2,1,0.5,0.2,0.1};int n =sizeof(rmb)/sizeof(rmb[0]), k, i;float change, r[N];;printf("请输入要找的零钱数:");scanf("%f",&change);for(i =0; i < n; i++)if(change >= rmb[i])break;
k =exchage(change,&rmb[i], n - i, r);if(k <=0)printf("找不开!\n");else{printf("找零钱的方案:%.2f=", change);if(r[0]>=1.0)printf("%.0f", r[0]);elseprintf("%.2f", r[0]);for(i =1; i < k; i++){if(r[i]>=1.0)printf("+%.0f", r[i]);elseprintf("+%.2f", r[i]);}printf("\n");}system("pause");}intexchage(float n,float*a,int c,float*r){int m;if(n ==0.0)/*能分解,分解完成*/return0;if(c ==0)/*不能分解*/return-1;if(n <*a)returnexchage(n, a +1, c -1, r);/*继续寻找合适的面值*/else{*r =*a;/*将零钱保存到r中*/
m =exchage(n -*a, a, c, r +1);/*继续分解剩下的零钱*/if(m >=0)return m +1;/*返回找零的零钱张数*/return-1;}}