1. 程式人生 > 其它 >Windows伺服器分散式事務配置摘要

Windows伺服器分散式事務配置摘要

在網友的國度中共有 n 種不同面額的貨幣,第 i 種貨幣的面額為 a[i],你可以假設每一種貨幣都有無窮多張。

為了方便,我們把貨幣種數為 n、面額陣列為 a[1..n] 的貨幣系統記作 (n,a)。

在一個完善的貨幣系統中,每一個非負整數的金額 x 都應該可以被表示出,即對每一個非負整數 x,都存在 n 個非負整數 t[i] 滿足 a[i]×t[i] 的和為 x。

然而,在網友的國度中,貨幣系統可能是不完善的,即可能存在金額 x 不能被該貨幣系統表示出。

例如在貨幣系統 n=3, a=[2,5,9] 中,金額 1,3 就無法被表示出來。

兩個貨幣系統 (n,a) 和 (m,b) 是等價的,當且僅當對於任意非負整數 x,它要麼均可以被兩個貨幣系統表出,要麼不能被其中任何一個表出。

現在網友們打算簡化一下貨幣系統。

他們希望找到一個貨幣系統 (m,b),滿足 (m,b) 與原來的貨幣系統 (n,a) 等價,且 m 儘可能的小。

他們希望你來協助完成這個艱鉅的任務:找到最小的 m。

輸入格式
輸入檔案的第一行包含一個整數 T,表示資料的組數。

接下來按照如下格式分別給出 T 組資料。

每組資料的第一行包含一個正整數 n。

接下來一行包含 n 個由空格隔開的正整數 a[i]。

輸出格式
輸出檔案共有 T 行,對於每組資料,輸出一行一個正整數,表示所有與 (n,a) 等價的貨幣系統 (m,b) 中,最小的 m。

資料範圍
1≤n≤100,
1≤a[i]≤25000,
1≤T≤20
輸入樣例:
2
4
3 19 10 6
5
11 29 13 19 17
輸出樣例:
2
5

這一題首先發現一個重要的性質,b裡的m個數都是從a裡面選的,如果b裡的某個數不是從a裡面選,設該數為x,由於兩個陣列可以互相表示,x可以表示為若干ai的代數和,又因為ai又能被bi表示,x即能被其他bi表示,即x是多餘的,這樣的x在b陣列中是不存在的。

由於大的數可能被小的數表示,把每一個數想象成揹包的體積,然後小的數就是不同體積的物品,恰好把揹包填滿,如果方法數為0,即加入b陣列中。

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const int N = 101, M = 25010;
int f[M];
int a[N];
int n;

int main()
{
	int T;
	cin >> T;
	while (T--)
	{
		cin >> n;
		for (int i = 0; i < n; i++)cin >> a[i];
		sort(a, a + n);
		memset(f, 0, sizeof f);
		f[0] = 1;
		int ans = 0;
		for (int i = 0; i < n; i++)
		{
			if (!f[a[i]])ans++;
			for (int j = a[i]; j <= a[n - 1]; j++) {
				f[j] += f[j - a[i]];
			}
		}
		cout << ans << endl;
	}
}