阿里实习招聘面试编程题
给定正整数N,求将整数集合{k | 1<=k<=N且k为整数}划分为和相同的两个子集和的方式
eg:{1,2,3} 划分方式有一种{1,2},{3}
方法同Leetcode-494 TargetSum
dp:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <vector> #include <algorithm> using namespace std; int SubsetSum(int num[],int len,int s) //在num[]中找所有可以加和=s的所有情况 { int n; int dp[s+1]; memset(dp,0,sizeof(dp)); dp[0]=1; for(int j=0;j<len;++j) //枚举num中的所有元素 { n=num[j]; for(int i=s;i>=n;--i) { dp[i]=dp[i]+dp[i-n]; //dp[i-n]+n=i } } return dp[s]; } int main() { int n; while(~scanf("%d",&n)) { int num[n+1]; int sum=0; int k=0; for(int i=1; i<=n; ++i) { num[k++]=i; sum+=i; } if(sum%2!=0) { printf("0\n"); } else { sum=sum/2; printf("%d\n",SubsetSum(num,n,sum)/2); } } return 0; }