筛法求解,一步步筛去可以表示的数,最后留下的不能被筛去的就是答案。
当然这也可以看作是一个完全背包。
在trans数组中:
- 0:该面额不能被表示
- 2:有该面额的货币
- 1:该面额能被更小额的货币表示
#include <bits/stdc++.h>
using namespace std;
const int MAXT = 25001;
const int MAXN = 101;
int n;
int ans;
int trans[MAXT];
int coins[MAXN];
int main() {
ios::sync_with_stdio(false);
int t;
cin >> t;
while ( t-- ) {
cin >> n;
for ( int i = 1; i <= n; ++i ) {
cin >> coins[i];
trans[coins[i]] = 2;
}
sort(coins + 1, coins + 1 + n);
for ( int i = 1; i <= coins[n]; ++i ) {
if ( trans[i] ) {
for ( int j = 1; j <= n; ++j )
if ( i + coins[j] <= coins[n] )
trans[i + coins[j]] = 1;
else
break;
}
}
for ( int i = 1; i <= n; ++i )
if ( trans[coins[i]] == 2)
++ans;
cout << ans << endl;
ans = 0;
memset(trans, 0, sizeof(trans));
}
return 0;
}