• P5020 货币系统


    题目描述

    在网友的国度中共有n 种不同面额的货币,第 ii 种货币的面额为a[i],你可以假设每一种货币都有无穷多张。为了方便,我们把货币种数为 n、面额数组为 a[1..n] 的货币系统记作 (n,a)

    在一个完善的货币系统中,每一个非负整数的金额x 都应该可以被表示出,即对每一个非负整数 x,都存在n个非负整数 T[i]满足a[i]×t[i] 的和为 x。然而, 在网友的国度中,货币系统可能是不完善的,即可能存在金额 x不能被该货币系统表示出。例如在货币系统 n=3 a=[2,5,9]中,金额1,3 就无法被表示出来。

    两个货币系统 (n,a)和(m,b)是等价的,当且仅当对于任意非负整数 x,它要么均可以被两个货币系统表出,要么不能被其中任何一个表出。

    现在网友们打算简化一下货币系统。他们希望找到一个货币系统(m,b),满足 (m,b)与原来的货币系统 (n,a)等价,且 m 尽可能的小。他们希望你来协助完成这个艰巨的任务:找到最小的m

    输入输出格式

    输入格式:

    输入文件的第一行包含一个整数T,表示数据的组数。

    接下来按照如下格式分别给出 T 组数据。 每组数据的第一行包含一个正整数n。接下来一行包含n 个由空格隔开的正整数 a[i]。

    输出格式:

    输出文件共有T 行,对于每组数据,输出一行一个正整数,表示所有与(n,a) 等价的货币系统 (m,b) 中,最小的 m。

    ——————————————————————————————————————————————————————

    经过了在Loj上数万年的调试输入输出后与经历被memset使用问题暴打后总算调过了本题,用时思路10min,调试1h,绝了

    在考场上我应该能想起来的事80分与100(bug),我一开始想的就是100分做法,结果输出时出错又赶紧换了一个暴力一点的,还是感觉可以的

    80pt

    // luogu-judger-enable-o2
    #include<bits/stdc++.h>
    using namespace std;
    int n,a[1000],t,f[25100];
    int main()
    {
        cin>>t;
        while(t--)
        {
            int cnt=0;
            cin>>n; 
            for(int i=1;i<=n;i++)scanf("%d",&a[i]);
            for(int i=1;i<=n;i++)
            {    for(int k=1;k<=a[i];k++)f[k]=0;
                f[0]=1;
                for(int k=1;k<=n;k++)
                {
                    if(f[a[i]])break;
                    if(k==i)continue;
                    for(int j=1;j<=a[i];j++)
                    {
                        if(j-a[k]>=0&&f[j-a[k]])f[j]=1;
                    }
                }    
                if(!f[a[i]])cnt++;
            }
            cout<<cnt<<endl;
        }
    }

    100pt

    #include<bits/stdc++.h>
    using namespace std;
    int n,a[2000],t,f[25100];
    int main()
    {
        
        cin>>t;
        while(t--)
        {
            memset(f,0,sizeof(f));
            f[0]=1;
            int cnt=0,maxn=-1;
            cin>>n; 
            for(int i=1;i<=n;i++){cin>>a[i];maxn=max(a[i],maxn);}
            for(int i=1;i<=n;i++)
            for(int j=1;j<=maxn;j++)if(j-a[i]>=0&&f[j-a[i]])f[j]++;    
            for(int i=1;i<=n;i++)if(f[a[i]]<=1)cnt++;
            cout<<cnt<<endl;
        }
    }
  • 相关阅读:
    【数据结构】优先队列和堆
    【ACM非算法部分】读入优化
    【解题报告】[动态规划]RQNOJ
    【解题报告】[动态规划]RQNOJ
    【解题报告】[动态规划]-PID69 / 过河卒
    【解题报告】[动态规划]
    【解题报告】[动态规划]RQNOJ PID2 / 开心的金明
    扫描线矩形周长的并 POJ1177
    fft模板 HDU 1402
    离线树状数组 hihocoder 1391 Countries
  • 原文地址:https://www.cnblogs.com/SFWR-YOU/p/10914587.html
Copyright © 2020-2023  润新知