java 代码:利用递归打印所有组合以及总数,修改nextChange()函数即可求解这两个问题
int changes[]={1,2,5};
Map<Integer,Integer> print = new HashMap<Integer,Integer>();
int nextChange(int change){
int nextChange=0;
switch(change){
case 10:
nextChange= 5;
break;
case 5:
nextChange= 2;
break;
case 2:
nextChange= 1;
break;
}
return nextChange;
}
int makeChange(int n, int change,HashMap<Integer,Integer> print){
int way=0,i;
if(change==1){
print.put(1, n);
printAll(print);
return 1;
}
for(i=0;i*change<=n;i++){
print.put(change, i);
way+=makeChange(n-i*change,nextChange(change),print);
}
return way;
}
public void printAll(HashMap<Integer,Integer> map){
Iterator iter = map.entrySet().iterator();
StringBuffer sb = new StringBuffer();
while(iter.hasNext()){
Map.Entry entry = (Map.Entry) iter.next();
Integer key = (Integer) entry.getKey();
Integer val = (Integer) entry.getValue();
for(int i=0;i<val;i++){
sb.append(key+" ");
}
}
System.out.println(sb);
}
#include <stdlib.h>
#define N 10000
int a[N];
int change[3]={1,2,5};
int makeChange(int n, int changeCount){
a[0]=1;
int i,j;
for(i=0;i<changeCount;i++){
for(j=change[i]; j<= n; j++){
a[j]=a[j]+a[j-change[i]];
}
}
return a[n];
}
int main(){
printf("%d",makeChange(100,3));
getchar();
}