思路:
dp[i]表示i元零钱需要多少种方案。
先选取一个硬币,然后从小到大更新后面的方案数。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
const int maxn = 1e5+10;
const LL MOD = 1e9+7;
LL dp[maxn];
int a[13]={1,2,5,10,20,50,100,200,500,1000,2000,5000,10000};
int main(void){
dp[0] = 1;
for(int i=0;i<13;i++){
for(int j=a[i];j<=maxn;j++){
dp[j] = (dp[j]+dp[j-a[i]])%MOD; //从后面的j-ai个硬币加上ai个硬币更新j个硬币的方案数
}
}
int T;scanf("%d",&T);
while(T--){
int n;scanf("%d",&n);
printf("%lld\n",dp[n]);
}
return 0;
}