698. 貨幣系統
★☆ 輸入文件:moneysys.in
輸出文件:moneysys.out
簡單對比時間限制:1 s 內存限制:128 MB
描述 USACO 2.3.4
母牛們不但創建了它們自己的政府而且選擇了建立了自己的貨幣系統。由於它們特殊的思考方式,它們對貨幣的數值感到好奇。
傳統地,一個貨幣系統是由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),即在0 到2^63-1之間。
輸入格式:
(輸入文件名:moneysys.in)
貨幣系統中貨幣的種類數目是 V (1<=V<=25)。要構造的數量錢是 N (1<= N<=10,000)。
第一行: 二個整數,V 和 N 。
第二行: 可用的貨幣的面值 。
輸出格式:
(輸出文件名: moneysys.out)
單獨的一行包含那個可能的用這v種硬幣湊足n單位貨幣的方案數。
SAMPLE INPUT
3 10
1 2 5
SAMPLE OUTPUT
10
#include <iostream>
#include <cstdio>
using namespace std;
#define MAX_V 10000
#define MAX_N 10001
long long V,N;
long long dp[MAX_N];
int main()
{
freopen("moneysys.in","r",stdin);
freopen("moneysys.out","w",stdout);
cin>>V>>N;
dp[0]=1;
for(int i=0;i<V;i++)
{
long long v;
cin>>v;
for(int j=v;j<=N;j++)
dp[j]+=dp[j-v];
}
cout<<dp[N]<<endl;
return 0;
}