P5020 [NOIP2018 提高组] 货币系统
》》》那些数可以被已有的书 替代
》》》一定要for (int i=1;i<=coins[n];i++) if (mon[i]>0) 重复多次累计
#include <cstdlib> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int mon[25001]={}; /* mon[i]=0 表示i面值的钱不能被凑出来 mon[i]=1 表示i面值的钱可以被凑出来 mon[i]=2 表示i面值的钱是货币系统中本来就有的钱 */ int coins[101]={};//存钱的面值 int T,n,ans=0; int main() { scanf("%d ",&T); while (T--) { ans=0; memset(mon,0,sizeof(mon)); memset(coins,0,sizeof(coins)); scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d",&coins[i]); mon[coins[i]]=2; } //把货币系统中的钱标好 sort(coins+1,coins+1+n); for (int i=1;i<=coins[n];i++) { if (mon[i]>0) //如果mon[i]能被凑出来 //那么mon[i+coins[j]]也能被凑出来 { for (int j=1;j<=n;j++) if (i+coins[j]<=coins[n]) //防止数组越界 mon[i+coins[j]]=1; else break; } } for (int i=1;i<=coins[n];i++) if (mon[i]==2) ans++; printf("%d\n",ans); } } /* #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int a[500],n,cnt,q[50000]; int main() { freopen("money.in","r",stdin); freopen("money.out","w",stdout); int T; scanf("%d",&T); for(int _=1;_<=T;_++) { memset(q,-63,sizeof q); int ans=0; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); q[0]=0; for(int i=1;i<=n;i++) for(int j=a[i];j<=30000;j++) q[j]=max(q[j],q[j-a[i]]+1); for(int i=1;i<=n;i++) if(q[a[i]]==1) ans++; printf("%d\n",ans); } return 0; }*/

浙公网安备 33010602011771号