您的位置:首页 > 职场人生

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

2016-03-19 17:13 302 查看
将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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: