问题描述:有一天小明来到一台神奇的取款机前,取款机可以无限提供某些特定面额的货币,小明想知道他要取出x元共存在几种不同的方案(取出顺序的不一样认为是相同的方案,具体以样例为准)。
输入格式
第一行一个整数m,表示提供的货币种数。
第二行共m个用空格隔开的数字,表示其具体面额。
第三行一个整数x,表示需要取出的钱额。
输出格式:输出一个整数,表示方案数。
输入样例
3
1 2 5
4
输出样例
3
输出说明 取出4元的3种方案分别为(2,2),(1,1,2),(1,1,1,1)。
程序清单
var
dp: array[ 0 ..10001] of longint;
a: array[1..10] of longint;
i, j, x, m:longint;
begin
read(m);
for i := 1 to m do read(a[i]);
readln(x) ;
fillchar(dp, sizeof(dp), 0);
dp[0] := 1 ;
for i := 1 to m do
for j := 0 to x do
begin
if j+a[i]>x then break;
if dp[j] = 0 then continue ;
dp[j+a[i]] := dp[j+a[i]] + dp[j] ;
end;
writeln(dp[x]);
end.