Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:一组比较BT的数据!

Posted by EashionDi at 2016-12-21 14:23:53 on Problem 1011
In Reply To:一组比较BT的数据! Posted by:winboycool at 2007-04-22 00:07:27
> 64
> 40 40 30 35 35 26 15 40 40 40 40 40 40 40 40 40 40 40 40 40 40 
> 
> 40 40 43 42 42 41 10 4 40 40 40 40 40 40 40 40 40 40 40 40 40 
> 
> 40 25 39 46 40 10 4 40 40 37 18 17 16 15 40 40 40 40 40 40 40 
> 
> 40
> 
> //答案:
> 第1 of 5根木棍:
> 46+43+42+42+41+40+40+40+40+40+40=454
> 第2 of 5根木棍:
> 40+40+40+40+40+40+40+40+40+40+40+10+4=454
> 第3 of 5根木棍:
> 40+40+40+40+40+40+40+40+40+40+40+10+4=454
> 第4 of 5根木棍:
> 40+40+40+40+40+40+40+40+40+40+39+15=454
> 第5 of 5根木棍:
> 40+40+40+40+40+37+35+35+30+26+25+18+17+16+15=454
> 
> 454



随然这组数据排不出来,但是A掉了。。。。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAX = 100;

bool cmp(const int& a,const int& b){
    return a>b;
}

int N;
int res;
bool flag;
bool fail;
int num[MAX];
bool visit[MAX];
void dfs(int deep,int sum);
int main(){
    while( scanf("%d",&N) != EOF ){
        if( N == 0 ){
            break;
        }
        res = -1;
        int tmp = 0;
        int tmp1 = -1;
        flag = false;
        fail = false;
        for( int i = 0; i < N; i++ ){
            scanf("%d",&num[i]);
            tmp += num[i];
            tmp1 = max(tmp1,num[i]);
        }
        sort(num,num+N,cmp);
        memset(visit,false,sizeof(visit));
        for( int i = tmp1; i <= tmp; i++ ){
            if( tmp%i == 0 ){
                fail = false;
                res = i;
                visit[0] = true;
                dfs(0,num[0]);
                visit[0] = false;
                if( flag == true ){
                    break;
                }
            }
        }
        printf("%d\n",res);
    }
    return 0;
}

void dfs(int deep,int sum){
    if( deep == N-1 ){
        flag = true;
        return ;
    }
    if( flag==true || sum>res || fail==true ){
        return ;
    }
    if( sum == res ){
        sum = 0;
    }
    for( int i = 0; i < N; i++ ){
        if( visit[i] == false ){
            if( sum+num[i] <= res ){
                visit[i] = true;
                dfs(deep+1,sum+num[i]);
                visit[i] = false;
                if( sum==0 && flag==false ){
                    break;
                }
                while( i<N && num[i]==num[i+1] ){
                    i++;
                }
            }
        }
    }
    return ;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator