程序员互动联盟 编码大赛第一题

将1到N的连续整数组成的集合划分成两个子集合,且保证每个集合的数字和是相等。例如,对于N=3,对应的集合{1,2,3}能被划分成{3} 和 {1,2}两个子集合.
这两个子集合中元素分别的和是相等的。
对于N=3,我们只有一种划分方法,而对于N=7时,我们将有4种划分的方案。
输入包括一行,仅一个整数,表示N的值(1≤N≤39)。
输出包括一行,仅一个整数,晓萌可以划分对应N的集合的方案的个数。当没发划分时,输出0。

输入:
7
输出:
4
程序员互动联盟是个微信号,还不错,发的题目也不难。
分析:这题很明显暴力解决,但是先前竟然把题看错了,纠结了半天,无语了!思路也简单,就是递归求随机数求和,为了不重复,就顺序搜索就好了!

#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int n,as=0;
int mark[300];
void dfs(int ans,int sm,int k)//sum代表和,sm代表已加到的和 k为这次递归位置 
{
    if(sm>ans)
    return;
    if(ans==sm) 
    {
        as++;
        return ;
    }
    for(int i=k+1;i<=n;i++)
    {
        if(!mark[i])
        {
        mark[i]=i;
        dfs(ans,sm+i,i);
        mark[i]=0;
        }
    }
}

int main()
{
    memset(mark,0,sizeof(mark));
    while(cin>>n)
    {
        int sum=(1+n)*n/2;//n个数的和
        sum/=2;
    dfs(sum,0,0);
    cout<<as/2<<endl;//所有解中,一定是两对组合成解
    }
    return 0;
 } 

你可能感兴趣的:(编码)