zoukankan      html  css  js  c++  java
  • HRBEU equal

    http://acm.hrbeu.edu.cn/index.php?act=problem&id=1004&cid=21 

    这道题类似与hdu的1095

    http://acm.hdu.edu.cn/showproblem.php?pid=1059

    题目意思:给你一串数,让你找能不能使的这些数分成6个集合,而且每个集合内元素的和为{sum(总)/6}

    思路:首先呢如果sum(总)%6不为零,则一定不能平分.

    如果为零给给定的数串排序,如果a[N]>{sum(总)/6}也不能平分,如果不大于,那么就按正常的dfs找就行了。

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    void check();
    void dfs(int ,int ,int );
    #define N 40
    int v[N],a[N];
    int flag,m;
    int n;
    void check(int x)
    {
        if(x>6)
        {
            flag=1;return ;
        }
        int i;
        for(i=1;i<=n;i++)
        {
            if(!v[i]) break;
        }
        v[i]=1;
        dfs(x,i,a[i]);
        v[i]=0;
    }
    void dfs(int x,int k,int sum)
    {
        if(flag==1) return;
        if(sum==m)
        {
            check(x+1);
            return ;
        }
        for(int i=k+1;i<=n;i++)
        {
            if(!v[i]&&sum+a[i]<=m)
            {
                v[i]=1;
                dfs(x,i,sum+a[i]);
                v[i]=0;
            }
        }
    }
    int main()
    {
        int t;
        int i;
        cin>>t;
        while(t--)
        {
            flag=0;
            m=0;
            memset(v,0,sizeof(v));
            cin>>n;
            for(i=1;i<=n;i++)
            {
                cin>>a[i];
                m+=a[i];
            }
            sort(a+1,a+n+1);
            int k=m;
            m/=6;
            if(k%6||a[n]>m)
            {
                cout<<"no\n";
                continue;
            }
            check(1);
            if(flag) cout<<"yes\n";
            else cout<<"no\n";
        }
        return 0;
    }
    
  • 相关阅读:
    cg数据类型
    线程和流的历史遗留
    流的总结及小问题

    集合练习
    集合属性的整理
    集合
    整理
    面向对象中知识的薄弱点
    自己的小问题和数组常用的方法
  • 原文地址:https://www.cnblogs.com/fxh19911107/p/2271921.html
Copyright © 2011-2022 走看看