トピック
回答
- 2つの通貨システムが同等である場合、次のプロパティがあります
プロパティ1:a1、a2、a3 ... anを表す必要があります。
プロパティ2:最適解では、b1、b2、b3 ... bmはa1、a2、a3 ... an
3から選択されたプロパティである必要があります。 b1、b2、b3 ... bmを他のbiで表すことはできません
- 配列を小さいものから大きいものに並べ替えます
(1)aiをa0–ai-1で表すことができる場合、その数はb配列に含まれていてはなりません。
(2)aiをa0–ai-1で表せない場合、その数はb配列に含まれている必要があります。
- 任意の数a0—ai-1がaiを表すことができるかどうかを見てみましょう。これは、解の数を見つけるために完全なナップサック問題に変換されます。
コード
#include<bits/stdc++.h>
using namespace std;
const int N = 110, M = 25010;
int t, n;
int a[N];
int f[M];
int main() {
cin >> t;
while (t--) {
memset(f, 0, sizeof f);
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
sort(a + 1, a + 1 + n);
int m = a[n];
int res = 0;
f[0] = 1;
for (int i = 1; i <= n; i++) {
if (!f[a[i]]) res++;
for (int j = a[i]; j <= m; j++) {
f[j] += f[j - a[i]];
}
}
cout << res << endl;
}
return 0;
}