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;
}*/

 

posted @ 2023-09-03 09:57  JMXZ  阅读(28)  评论(0)    收藏  举报