想不通丶求解释
输入一个N,把1到N的所有数分成两组要求两组中数的和相等,输出一共有几种分发,否则输出0.我想应该把说有数加起来,和是奇数输出0,如果是偶数我就想不通怎么实现上面的问题
程序代码:#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
void f(int);
void main()
{
int n;
printf("请输入一个正整数:\n");
scanf("%d",&n);
f(n);
}
void f(int n)
{
int i,j,max,m,k,sum=0,flag;
int stack[MAXSIZE],top=0,visited[MAXSIZE]={0};
max=n*(n+1)/2;
if(max%2==1)
{
printf("0\n");
return;
}
else max=max/2;
for(i=1;i<=n;i++)
{
stack[top++]=i;
flag=1;
sum=0;
while(top)
{
m=stack[--top];
if (flag)
{
sum+=m;
if (sum==max)
{
visited[m]=1;
printf("%4d",m);
printf("\n");
for(k=1;k<=n;k++)
{
if(!visited[k])
printf("%4d",k);
visited[k]=0;
}
printf("\n***********\n");
break;
}
}
else sum-=m;
flag=0;
for(j=m+1;j<=n;j++)
{
sum+=j;
if(sum<max)
stack[top++]=j;
else if (sum==max)
{
stack[top]=j;
printf("%4d",i);
visited[i]=1;
for(k=0;k<=top;k++)
{
visited[stack[k]]=1;
printf("%4d",stack[k]);
}
printf("\n");
for(k=1;k<=n;k++)
{
if(!visited[k])
printf("%4d",k);
visited[k]=0;
}
printf("\n***********\n");
sum-=j;
break;
}
else
{
sum-=j;
break;
}
}
}
}
}
程序代码:
#include <stdio.h>
#include <stdlib.h>
#define Nmax 100
int n,i,j,goal,sum,f[Nmax+1][Nmax*(Nmax+1)/4+1];
int main()
{
scanf("%d",&n);
sum=n*(n+1)/2; goal=sum/2;
if (sum%2==1) printf("0\n"); else
{
memset(f,0,sizeof(f)); f[0][0]=1;
for (i=1; i<=n; i++)
for (j=goal; j>=0; j--)
if (j>=i) f[i][j]=f[i-1][j]+f[i-1][j-i]; else f[i][j]=f[i-1][j];
printf("%d\n",f[n][goal]/2);
}
system("pause");
}