1. 程式人生 > >21869 Problem C 貨幣系統

21869 Problem C 貨幣系統

問題 C: 貨幣系統

時間限制: 1 Sec  記憶體限制: 128 MB
提交: 150  解決: 51
[提交][狀態][討論版][命題人:外部匯入]

題目描述

母牛們不但建立了他們自己的政府而且選擇了建立了自己的貨幣系統。
[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)。

輸入

輸入包含多組測試資料

貨幣系統中貨幣的種類數目是 V 。 (1<= V<=25)
要構造的數量錢是 N 。 (1<= N<=10,000)

第 1 行:  二整數, V 和 N
第 2 ..V+1行: 可用的貨幣 V 個整數 (每行一個 每行沒有其它的數)。

輸出

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

樣例輸入

3 10
1 2 5

樣例輸出

10
#include<iostream>
#include<algorithm>
using namespace std;
//類似完全揹包種數問題
//dp[j]表示構造面值為j的方案數
int main() {
	int V, N, x;
	while (cin >> V >> N) {
		long long dp[10050] = { 1 };//注意為long long型
		for (int i = 0; i < V; i++) {
			cin >> x;
			for (int j = x; j <= N; j++) {
				dp[j] += dp[j - x];//面值為j的方案數=第i個貨幣出現之前面值為j的方案數+面值為j-i的方案數*1(即+i);
			}
		}
		cout << dp[N] << endl;
	}
	return 0;
}