阿里实习招聘面试编程题

给定正整数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
");
    }
    else
    {
        sum=sum/2;
        printf("%d
",SubsetSum(num,n,sum)/2);
    }

    }
    return 0;
}
原文地址:https://www.cnblogs.com/dshn/p/8810783.html