T137226 彩虹海

Posted hansue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了T137226 彩虹海相关的知识,希望对你有一定的参考价值。

设目标体系$(n,a)$和答案体系$(m,b)$分别为集合$A$和集合$B$,那么我们可以猜想$Bsubseteq A$。

我们可以先通过反证法验证下面两个结论:

若$xin A$可以被其他$A$中的数表达出来,那么有$x otin B$。

若$xin A$不能被其他$A$中的数表达出来,那么有$xin B$。

然后再通过上述结论,使用反证法证明$Bsubseteq A$。具体就是取一个$x$,令$xin B$且$x otin A$,证明这样的$x$不存在。

于是我们只需要找到$A$中能被表达出来的数并删去即可。

具体来说,需要先将$a$排序,然后每次$forall xin[a_i,a_n]$,令$f_xleftarrow f_{x-a_i}$。

 

代码:

技术图片
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define IL inline
#define RG register
using namespace std;
#define RI RG int
#define RC RG char 
const int N=100;
const int M=25000;

    int T,n,a[N+3];
    bool f[M+3];
    
IL void sol(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
        
    sort(a+1,a+n+1);
    memset(f,0,sizeof(f));
    
    f[0]=1;
    int ans=n;
    for(RI 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]];
            
    }
    printf("%d
",ans);
    
}
    
int main(){
    freopen("data.in","r",stdin);
    freopen("data.ans","w",stdout);
    
    scanf("%d",&T);
    while(T--)
        sol();
        
    return 0;
    
}
View Code

 

以上是关于T137226 彩虹海的主要内容,如果未能解决你的问题,请参考以下文章

现在的你迷茫吗?是否还在做毕业后的高薪梦?你相信彩虹海吗?

现在的你迷茫吗?是否还在做毕业后的高薪梦?你相信彩虹海吗?

现在的你迷茫吗?是否还在做毕业后的高薪梦?你相信彩虹海吗?

QQ群免IDKEY加群PHP源码

树莓派系列-5-4B配置关闭休眠去掉滚动代码,彩虹瓶,增加开机动画

树莓派系列-5-4B配置关闭休眠去掉滚动代码,彩虹瓶,增加开机动画