可以用动态规划的思想,将问题拆分成若干子问题
定义状态f[i]表示用题中3种纸币兑换i元的方案总数,则有
f[i]=∑(f[i-j]); 其中j为50、20、10,边界为f[0]~f[9]为0;
又因为题中所有数据均为10的整倍数,可以同时除以10,再进行以上DP,则范围缩小10倍,也可以省去很多无效枚举(如24、33之类非整10的数),此时的边界为f[0]=0;
这个是1维的,不知道符不符合LZ的要求……
临时想的算法,没有严格验证正确性,如有问题,请追问,谢谢。
var a,b,c,t:integer;
begin
for a:=1 to 10 do
for b:=1 to 5 do
for c:=1 to 2 do
begin
if a*10+b*20+c*50=100 then begin
t:=t+1;
writeln(a*10,'+',b*20,'+',c*50,' ',t);
end;
end;
readln;
end.
用我的吧.