1. 程式人生 > >Money Systems 貨幣系統(母函數)

Money Systems 貨幣系統(母函數)

script string define 數量 序號 namespace sample ++ NPU

Description

母牛們不但創建了他們自己的政府而且選擇了建立了自己的貨幣系統。 [In their own rebellious way],,他們對貨幣的數值感到好奇。 傳統地,一個貨幣系統是由1,5,10,20 或 25,50, 和 100的單位面值組成的。 母牛想知道有多少種不同的方法來用貨幣系統中的貨幣來構造一個確定的數值。 舉例來說, 使用一個貨幣系統 {1,2,5,10,...}產生 18單位面值的一些可能的方法是:18x1, 9x2, 8x2+2x1, 3x5+2+1,等等其它。 寫一個程序來計算有多少種方法用給定的貨幣系統來構造一定數量的面值。 保證總數將會適合long long (C/C++) 和 Int64 (Free Pascal)。

Input

貨幣系統中貨幣的種類數目是 V 。 (1<= V<=25) 要構造的數量錢是 N 。 (1<= N<=10,000) 第 1 行: 二整數, V 和 N 第 2 ..V+1行: 可用的貨幣 V 個整數 (每行一個 每行沒有其它的數)。

Output

單獨的一行包含那個可能的構造的方案數。

Sample Input

3 10
1 2 5

Sample Output

10

HINT

題意:給出v個面值的錢幣,每種面值的錢幣有無數張,求組成面值為n的錢幣的方案數;

題解:母函數構造,(1+x^(value[i])+x^2*(value[i])+....+x^(value[i]*n))(1+x^(value[i])+x^2*(value[i])+....+x^(value[i]*n))....,(1+x^(value[i])+x^2*(value[i])+....+x^(value[i]*n))1<=i<=v,最後a[n]的值即為方

#include<cstdio>
#include<cstring>
#include<stack>
#include<iostream>
#include<queue>
#include<algorithm>
#include<cmath>
#include<map>
#include<vector>
#define PI acos(-1.0)
using namespace std;
typedef long long ll;
const int MAXN=1e4+10
; const int Inf=0x3f3f3f3f; int m,n; ll str[MAXN]; ll a[MAXN]; ll b[MAXN]; map<ll,ll>::iterator it; void solve() { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); a[0]=1;for(int i=1; i<=m; i++)//m層括號 { for(int j=0; j<=10000; j++)//j表示第i-1個括號每一元素的序號 { for(int k=0; k+j<=n; k+=str[i])//str[i]表示當前行元素冪的增量,k+j表示第i-1行每一個元素與該行每一個元素的乘積,得到該元素的冪,合並兩個算試 { b[k+j]+=a[j];//將冪相同的元素合並在一起 } } for(int j=0; j<=n; j++) { a[j]=b[j]; b[j]=0; } } cout<<a[n]<<endl; } int main() { while(cin>>m>>n) { ll Min=Inf; for(int i=1; i<=m; i++) { cin>>str[i]; } solve(); } }

Money Systems 貨幣系統(母函數)