【题解】初次写题解,有不对的请指出。😂


1.如果1-a[1..n]中最大的数都能被表示出来,则任意非负整数均能被这个货币系统表示; (范围一定了)
2.等价的货币系统b中的币值一定属于a中的
3.如果已知货币系统中的币值能被当前已知币值表示,则这个币值可以舍弃
样例模拟: 4
3 19 10 6
首先1-19不能被表示的为: 1 2 4 5 7 8 11 14 17
证明1:
反证 :如果存在大于19(对其他货币系统里的面值也适用)的数X不能被表示,那么X-19=Y也不能被表示,如果Y大于19,继续以上步骤,直到Y'<19不能被表示,与已知矛盾,证毕。
证明2:
反证:如果b中存在不属于a中的货币面值z。A.b中是最优解,因此b中的货币不会被存在于b中的其他货币表示出来。B.因为a和b等效,所以a不能表示的和b不能表示的一样(这点很重要)
那么如果这个z属于不能表示的币值,那么和B矛盾。如果这个z属于a能表示的币值(不包括a),那么 z就不能表示a中的某一个面值,矛盾。
综合1,2,可以得出3.


#include <iostream>
#include <algorithm>
#include <cstring>


using namespace std;

const int N=105;

int t,n;
int a[N],f[25005];

int main()
{
    cin>>t;
    while(t--)
    {
        memset(a,0,sizeof a);
        memset(f,0,sizeof f);
        
        cin>>n;
        for(int i=1;i<=n;i++)
        cin>>a[i];
        
        f[0]=1;
        sort(a+1,a+1+n);
        int ans=n;
        
        for(int i=1;i<=n;i++)
        {   
            if(f[a[i]])
            {
                ans--;
                continue;
            }
            for(int j=a[i];j<=a[n];j++)
               f[j]|=f[j-a[i]]; 
        }
           
        cout<<ans<<endl;
    }
    return 0;
}
全部评论

相关推荐

Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
勇敢的联想人前程似锦:如果我是你,身体素质好我会去参军,然后走士兵计划考研211只需要200多分。
点赞 评论 收藏
分享
4 收藏 评论
分享
牛客网
牛客企业服务