给出几种硬币,数量不限,问你用着几种硬币能组成价值为n的种类是多少。
第一眼看到,求数量,就想到dp,直接找转移方程dp[i] = dp[i] + dp[i - coin[j]];
/*
ID: xvoid191
PROG: money
LANG: C++
*/
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
long long coin[30],dp[10001];
int n,v;
int main()
{
freopen("money.in","r",stdin);
freopen("money.out","w",stdout);
scanf("%d %d",&v,&n);
memset(dp,0,sizeof(dp));
for(int i = 0; i < v; i++){
scanf("%d",&coin[i]);
}
dp[0] = 1;
for(int i = 0; i < v; i++){
for(int j = coin[i]; j <= n; j++ ){
dp[j] += dp[j - coin[i]];
}
}
printf("%lld\n",dp[n]);
}