poj

来源:互联网 发布:c语言随机数生成 编辑:程序博客网 时间:2024/06/03 12:40
欢迎视察,觉得不错您顶一个鼓励我一下,有什么意见或建议欢迎留言~~吐舌头吐舌头
又套路了一个 dfs + 剪枝
题意 : 给定 n ,按照习惯 我们看做 0 - (n-1),,题目的意思是要把这 n 个数分成 A,B 两组 要干啥呢? :
任意分别从 A B 两组中 找一个数 定为 i,j 关键来了:求和---所有 ma[i][j] 的和 (ma[][] 存给定权值数组 )
额,就这些,dfs 的是 0 - (n-1),用 f[] 这个标志数组 0/1 值 表示是否为初始组
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int maxn = 100 + 10;int n, ans, ma[maxn][maxn], f[maxn];void dfs(int id, int sum) {    f[id] = 1;    int num = sum;    for(int i = 0; i < n; ++i) {        if(f[i] == 1)            num -= ma[id][i];        else            num += ma[id][i];    }    ans = max(num, ans);    for(int i = id+1; i < n; ++i) {        if(num > sum) {            dfs(i, num);            f[i] = 0;        }    }}int main() {    while(scanf("%d", &n) == 1 && n) {        memset(ma, 0, sizeof ma);        memset(f, 0, sizeof f);        for(int i = 0; i < n; ++i)            for (int j = 0; j < n; ++j)            scanf("%d", &ma[i][j]);        ans = -10;        dfs(0, 0);        printf("%d\n", ans);    }    return 0;}

1 0
原创粉丝点击