zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    C#深入浅出 修饰符(二)
    HDU 5785 Interesting
    HDU 5783 Divide the Sequence
    HDU 5781 ATM Mechine
    UVA 714 Copying Books
    uva 1471 Defense Lines
    UVA 11134 Fabled Rooks
    UVA 11572 Unique Snowflakes
    UVA 11093 Just Finish it up
    UVA 10954 Add All
  • 原文地址:https://www.cnblogs.com/SFWR-YOU/p/10914587.html
Copyright © 2011-2022 走看看