码迷,mamicode.com
首页 > 其他好文 > 详细

【USACO】Subset Sums(双向搜索 dfs)

时间:2015-04-16 19:56:57      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

给你一组数 1 ~ N,问你能有几种分法,把他们分成2组,2组的和相等。

如果 sum(1 ~ n) 为奇数,直接输出0,负责的话 主要找到 和为 sum / 2的组数 再除以2就是结果

因为N 最大为39 如果单向搜索肯定超时,改成双向的就行了

/*
ID: 18906421
LANG: C++
PROG: subset
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn = 40;
const int maxd = 1500;
LL num[maxn],sum = 0,cnt = 0;
int n;
LL vis[maxd] = {0};
void dfs1(int pos,int num,int s){
    if(s <= sum)
        vis[s]++;
    else
        return;
    for(int i = pos; i <= num; i++)
        dfs1(i + 1,num,s + i);
    return;
}
void dfs2(int pos,int num,int s){
    if(s <= sum){
        int e = sum - s;
        if(vis[e]) cnt += vis[e];
    }
    else
        return;
    for(int i = pos; i <= num; i++)
        dfs2(i + 1,num,s + i);
    return;
}
int main(){
    freopen("subset.in","r",stdin);
    freopen("subset.out","w",stdout);
    cin >> n;
    for(int i = 1; i <= n; i++){
        num[i] = i;
        sum += i;
    }
    if(sum & 1)
        cout << 0 << endl;
    else{
        sum /= 2;
        dfs1(1,n / 2,0);
        dfs2(n / 2 + 1,n,0);
        cout << cnt / 2 << endl;
    }
    return 0;
}


【USACO】Subset Sums(双向搜索 dfs)

标签:

原文地址:http://blog.csdn.net/u013451221/article/details/45078893

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!