zoukankan      html  css  js  c++  java
  • SDUT 2766-小明传奇2(母函数)

    小明传奇2

    Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

    题目描写叙述

    小明不但创建了自己的商店并且选择了建立了自己的货币系统。
    传统地。一个货币系统是由1,5,10,20 或 25,50, 和 100的单位面值组成的。
    小明想知道有多少种不同的方法来用货币系统中的货币来构造一个确定的数值。
    举例来说, 使用一个货币系统 {1,2,5,10,...}产生 18单位面值的一些可能的方法是:18x1, 9x2, 8x2+2x1, 3x5+2+1,等等其他。 写一个程序来计算有多少种方法用给定的货币系统来构造一定数量的面值。保证总数在0 到2^63-1之间。

    输入

     多组输入。输入到文件末。
    货币系统中货币的种类数目是 V (1<=V<=25)。要构造的数量钱是 N (1<= N<=10,000)。

    第一行: 二个整数,V 和 N 。
    第二行: 可用的货币的面值 。

    输出

     单独的一行包括那个可能的用这v种硬币凑足n单位货币的方案数。

    演示样例输入

    3 10
    1 2 5

    演示样例输出

    10
    妥妥的母函数水过。。有点慢 跑了190MS
    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cctype>
    #include <cmath>
    #include <cstdlib>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <list>
    #define maxn 10010
    #define ll long long
    #define INF 0x3f3f3f3f
    #define pp pair<int,int>
    using namespace std;
    ll a[maxn],b[maxn],v[26],p,n;
    void solve()
    {
    	memset(a,0,sizeof(a));
    	a[0]=1;
    	for(int i=0;i<n;i++)
    	{
    		memset(b,0,sizeof(b));
    		for(int j=0;+j*v[i]<=p;j++)
    			for(int k=0;k+j*v[i]<=p;k++)
    			b[k+j*v[i]]+=a[k];
    		memcpy(a,b,sizeof(b));
    	}
    	printf("%lld
    ",a[p]);
    }
    int main()
    {
    	while(~scanf("%lld%lld",&n,&p))
    	{
    		for(int i=0;i<n;i++)
    			scanf("%lld",v+i);
    		solve();
    	}
    	return 0;
    }


  • 相关阅读:
    设计模式第一次练习
    区间最大数
    魔方数
    螺旋数
    回文串
    最长单词
    指针的应用之学生成绩
    赛马
    突击队任务
    贪婪之骑士
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7257157.html
Copyright © 2011-2022 走看看