用面值为50元、20元、10元、5元、2元、1元、5角、2角、1角、5分、2分、1分的凑成一万分,有多少种方式?

private void TSL2(int i,int G1){
if (i==3){ //以下就是数列求和了
int yn;
int a1,a2,an,an1;
int g;
int temp1;

g=G1-tm[3];
yn=g/5+1; //数列项数
a1=g/2+1; //第一项
a2=(g-5)/2+1;//第二项
an=(g-(yn-1)*5)/2+1;//第n项
an1=(g-(yn-2)*5)/2+1;//第n-1项

if((yn%2)==0){//为偶数时
if(yn==2){
n +=(a1+an);
}
else{
temp1=((a1+an)*(yn/2))/2+((a2+an1)*(yn/2))/2;
n +=temp1;
}
}
else{ //为奇数时
if(yn==1){n +=a1;}
else{
temp1=((a1+an)*((yn+1)/2)/2)+((a2+an1)*((yn-1)/2)/2);
n +=temp1;
}
}
}

else{
for (r[i-1]=0;r[i-1]<((G1-tm[i])/MZ[i]+1);r[i-1]++){

tm[i-1]=tm[i]+r[i-1]*MZ[i];
TSL2(i-1,G1);
}
}
}
//Sat Dec 30 13:57:42 CST 2017
//10000分总的组合数(递归算法二阶加速)=7089628318292844
//Sat Dec 30 15:10:29 CST 2017
//还有更快的算法吗?或能否验证结果的对错。

逆向统计,面值都转化成分,
50元也就是5000分,
i5000是10000/5000=2到0的循环,
i2000是10000-5000*i5000到0的循环,
i1000是10000-5000*i5000-2000*i2000到0的循环,
逆向穷举遍历追问

算法是可行的,关键是能不能在短时间得出结果。
Tue Jan 02 14:36:12 CST 2018
10000分总的组合数(递归算法二阶加速)=7089628318292844
Tue Jan 02 15:53:22 CST 2018
加速后,还要一个多小时,不加速要上千个小时了。

温馨提示:答案为网友推荐,仅供参考
相似回答