1273:【例9.17】货币系统

【题目描述】
给你一个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]);	
	}	
} 

猜你喜欢

转载自blog.csdn.net/lemon1090/article/details/89415388