想不通丶求解释
输入一个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"); }