《Cracking the coding interview》第八章第七题
有无限数量的25分,10分,5分,1分,写代码计算表示N分的表示方法有多少种。
如N=5;有{5}, {1,1,1,1,1} 两种
int makeChange(int n,int denom){
int next=0;
switch(denom){
case 25:
next=10;
break;
case 10:
next=5;
break;
case 5:
next=1;
break;
case 1:
return 1;
}
int ways=0;
for(int i=0;i*denom<=n;i++){
ways+=makeChange(n-i*denom,next);
}
return ways;
}
int main(){
int n;
cin>>n;
while(n){
cout<<"ways:"<<makeChange(n,25)<<endl;
cin>>n;
}
return 0;
}
===============2013-6-20==============
如果种类很多应当以数组表示,一个很明显的事实是,当n=0时,应当停止继续递归操作;而上述算法没有如此做,稍微改进后如下:
int change[4]={1,5,10,25};
int makeChange2(int n,int denom){
if(denom==0 || n==0){
return 1;
}
int ways=0;
for(int i=0;i*change[denom]<=n;i++){
ways+=makeChange2(n-i*change[denom],denom-1);
}
return ways;
}
int main(){
int n;
cin>>n;
while(n){
cout<<"ways2:"<<makeChange2(n,sizeof(change)/sizeof(int)-1)<<endl;
cin>>n;
}
return 0;
}
2013.10.11
给定一个整数n,输出所有和为n的自然数 。例如n=3 ,输出 1+1+1, 1+2, 3 三种序列
方法1 :枚举所有情况(树),空间复杂度是O(n)
#define MAX 10000
int C[MAX]={0};
int C_i=0;
void f2(int n){
if(n<=0){
for(int j=0;j<C_i;j++)
cout<<C[j]<<" ";
cout<<endl;
return;
}
for(int i=n;i>0;i--){
if(C_i>0 && i>C[C_i-1])
continue;
C[C_i++]=i;
if(n-i>=0)
f2(n-i);
C_i--;
}
}
void main(){
int n;
while(cin>>n){
f2(n);
}
}