思路:先将货币面值从小到大排序,再依次判断小货币能否组成大货币,如果可以则可以删除该种大货币。
#include<bits/stdc++.h> using namespace std; int a[100086]; int vis[250086]; int main() { int n,t; cin>>t; while(t--) { cin>>n; int ans=n; memset(vis,1,sizeof(vis)); for(int i=0;i<n;i++) { cin>>a[i]; vis[a[i]]=1; } sort(a,a+n); vis[0]=2; for(int i=0;i<n;i++) { if(vis[a[i]]==2) //如果变成2说明小货币已经组成了该货币 { ans--; } for(int j=0;j<=a[n-1];j++) { if(vis[j]==2) { vis[j+a[i]]=2; } } } cout<<ans<<endl; } }