zoukankan      html  css  js  c++  java
  • uva 1377

    比较不错的一个题,关键是理解状态转移

    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #define maxn 55
    using namespace std;
    int m,ans;
    
    int num[maxn],vis[maxn];
    bool cnt[1000009];
    int scale[10];
    
    bool dfs(int cur)
    {
    //    printf("%d %d
    ",cur,ans);
        if(cur==ans-1)
        {
            for(int i=0; i<m-1; i++)
                if(!vis[i])
                    return 0;
            return 1;
        }
    
        for(int i=0; i<cur; i++)
        {
            for(int j=0; j<m-1; j++)
            {
                if(vis[j])continue;
                int dd=scale[i]+num[j];
                vis[j]=1;
                if(dd<=scale[cur-1])continue;
                if(dd>=num[m-1])continue;
    
                scale[cur]=dd;
    
                queue<int>q;
                while(!q.empty())q.pop();
    
                for(int k=0; k<cur; k++)
                {
                    int tmp=dd-scale[k];
                    if(cnt[tmp]&&!vis[cnt[tmp]])
                    {
                        vis[cnt[tmp]]=1;
                        q.push(cnt[tmp]);
                    }
                }
    
                int tmp=num[m-1]-scale[cur];
                if(cnt[tmp]&&!vis[cnt[tmp]])
                {
                    vis[cnt[tmp]]=1;
                    q.push(cnt[tmp]);
                }
    
                if(dfs(cur+1))return 1;
                while(!q.empty())
                {
                    vis[q.front()]=0;
                    q.pop();
                }
            }
        }
        return 0;
    }
    
    int main()
    {
        int n,ca=1;
        while(scanf("%d",&n)&&n)
        {
            for(int i=0; i<n; i++)
                scanf("%d",&num[i]);
            sort(num,num+n);
            m=unique(num,num+n)-num;
    
            ans=2;
            while(ans*(ans-1)/2<m)
                ans++;
            memset(cnt,0,sizeof cnt);
            memset(vis,0,sizeof vis);
            for(int i=0; i<m; i++)
                cnt[num[i]]=i;
    
            scale[0]=0;
            while(!dfs(1))
                ans++;
            scale[ans-1]=num[m-1];
            printf("Case %d:
    ",ca++);
            printf("%d
    ",ans);
    
            for(int i=0;i<ans;i++)
                printf("%d ",scale[i]);
            puts("");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    elk 日志处理的一点思路
    elk 日志处理的一点思路
    elk 分布式部署
    elk 分布式部署
    分布式集群
    分布式集群
    分布式里数据保证容错性有两种方法.
    elk 数据存储
    elk 数据存储
    zookeeper 数据存储特点
  • 原文地址:https://www.cnblogs.com/yours1103/p/3848357.html
Copyright © 2011-2022 走看看