【题目描述】
给你一个n种面值的货币系统,求组成面值为m的货币有多少种方案。
【输入】
第一行为n和m。
【输出】
一行,方案数。
【输入样例】
3 10
1
2
5
【输出样例】
10
这道题既可以用母函数(不知道为什么母函数一直过不了)也可以用dp的背包来做,但有点坑的是题目中并未给你数的范围,此时你应该设置大点的数组,并且为long long型的(wa了好几次,竟不知道原因…)
AC代码:
//套背包方案总数的模板即可
#include<stdio.h>
int main()
{
long long n,m,dp[10005],a[10005],i,j;
while(scanf("%lld %lld",&n,&m)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
dp[0]=1;
for(i=1;i<=n;i++)
{
for(j=a[i];j<=m;j++)
dp[j]+=dp[j-a[i]];
}
printf("%lld\n",dp[m]);
}
}
母函数代码:(不知道为什么一直过不了)
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
long long n,m,c1[10005],c2[10005],i,j,k,a[10005];
while(scanf("%lld %lld",&n,&m)!=EOF)
{
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
//memset(c1,0,sizeof(c1));
//memset(c2,0,sizeof(c2));
for(i=0;i<=m;i++)
{
c1[i]=1;
c2[i]=0;
}
for(i=2;i<=n;i++)
{
for(j=0;j<=m;j++)
{
for(k=0;k+j<=m;k+=a[i])
c2[j+k]+=c1[j];
}
for(j=0;j<=m;j++)
{
c1[j]=c2[j];
c2[j]=0;
}
}
printf("%lld\n",c1[m]);
}
}