hdu 4152暴搜

简单题,暴搜就可以过了。

/*

 * hdu4152/win.cpp

 * Created on: 2012-7-28

 * Author    : ben

 */

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <cmath>

#include <ctime>

#include <iostream>

#include <algorithm>

#include <queue>

#include <set>

#include <map>

#include <stack>

#include <string>

#include <vector>

#include <deque>

#include <list>

#include <functional>

#include <numeric>

#include <cctype>

using namespace std;

const int MAXN = 22;

const int MAXM = 18;

typedef struct {

    int num;

    int lists[MAXM];

    void init() {

        num = 0;

    }

}Record;

inline bool operator<(const Record &r1, const Record &r2) {

    if(r1.num != r2.num) {

        return r1.num > r2.num;

    }else {

        for(int i = 0; i < r1.num; i++) {

            if(r1.lists[i] != r2.lists[i]) {

                return r1.lists[i] < r2.lists[i];

            }

        }

    }

    return true;

}

int N, M, goals[MAXN], data[MAXM][MAXN];

bool use[MAXM];

Record ans;



bool judge() {

    int tgoals[MAXN];

    memcpy(tgoals, goals, sizeof(goals));

    for(int i = 0; i < M; i++) {

        if(!use[i]) {

            continue;

        }

        for(int j = 0; j < N; j++) {

            tgoals[j] -= data[i][j];

        }

    }

    int j;

    for(j = 0; j < N; j++) {

        if(tgoals[j] > 0) {

            break;

        }

    }

    return j >= N;

}



void dfs(int m) {

    if(m > 0) {

        use[m - 1] = true;

        dfs(m - 1);

        use[m - 1] = false;

        dfs(m - 1);

        return;

    }

    if(!judge()) {

        return ;

    }

    Record temp;

    temp.init();

    for(int i = 0; i < M; i++) {

        if(use[i]) {

            temp.lists[temp.num++] = i + 1;

        }

    }

    if(temp < ans) {

        ans = temp;

    }

}



int main() {

#ifndef ONLINE_JUDGE

    freopen("data.in", "r", stdin);

#endif

    while(scanf("%d", &N) == 1) {

        for(int i = 0; i < N; i++) {

            scanf("%d", &goals[i]);

        }

        scanf("%d", &M);

        for(int i = 0; i < M; i++) {

            for(int j = 0; j < N; j++) {

                scanf("%d", &data[i][j]);

            }

        }

        memset(use, false, sizeof(use));

        ans.init();

        dfs(M);

        printf("%d", ans.num);

        for(int i = 0; i < ans.num; i++) {

            printf(" %d", ans.lists[i]);

        }

        putchar('\n');

    }

    return 0;

}

你可能感兴趣的:(HDU)