计蒜客--等和的分割子集
2018-03-27 21:18
239 查看
晓萌希望将 11 到 NN 的连续整数组成的集合划分成两个子集合,且保证每个集合的数字和是相等。例如,对于 N=3N=3,对应的集合 \{1,2,3\}{1,2,3} 能被划分成 \{3\}{3} 和 \{1,2\}{1,2} 两个子集合.
这两个子集合中元素分别的和是相等的。
对于 N=3N=3 ,我们只有一种划分方法,而对于 N=7N=7 时,我们将有 44 种划分的方案。
![](https://img-blog.csdn.net/20180327211003230?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4NTcwNTcx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
这两个子集合中元素分别的和是相等的。
对于 N=3N=3 ,我们只有一种划分方法,而对于 N=7N=7 时,我们将有 44 种划分的方案。
输入格式
输入包括一行,仅一个整数,表示 N(1 \le N \le 39)N(1≤N≤39)的值。输出格式
输出包括一行,仅一个整数,晓萌可以划分对应 NN 的集合的方案的个数。当没法划分时,输出 00。样例输入
7
样例输出
4用01背包的思想解决,开二维的dp,横坐标代表第i个数字,纵坐标j代表数字集合的和
#include<bits/stdc++.h> using namespace std; long long dp[42][1005]={0}; int main() { long long i,n,sum=0; cin>>n; sum=(1+n)*n/2; if(sum%2)//如果是奇数则直接输出0 cout<<'0'<<endl; else { for(int i=0;i<=n;i++)//初始化dp数组 { dp[i][0]=1; } for(int i=1;i<=n;i++) { for(int j=1;j<i;j++)//在小于i的情况下直接继承dp[i-1][j] { dp[i][j]=dp[i-1][j]; } for(int j=i;j<=sum/2;j++) { dp[i][j]=dp[i-1][j]+dp[i-1][j-i];//dp[i][j]=上一层的方案数+上一层数字和为i-j的方案数 } } cout<<dp [sum/2]/2;//因为等分集合是成对的所以除以2 } }
相关文章推荐
- 计蒜客第28题---等和的分割子集
- 计蒜客-等和的分隔子集
- 等和的分割子集
- [LeetCode] Partition Equal Subset Sum 相同子集和分割
- 计蒜客 难题题库 028 等和的分隔子集
- 回溯法(Backtracking)总结(子集,全排列,组合和,回文分割)
- 计蒜客 等和的分隔子集 (dp)
- 计蒜客 等和的分隔子集 DP
- 计蒜客等和的分隔子集
- 计蒜客刷题之旅 之 等和的分隔子集
- 计蒜客--第28题:等和的分隔子集
- [LeetCode] Partition to K Equal Sum Subsets 分割K个等和的子集
- (Java) LeetCode 416. Partition Equal Subset Sum —— 分割等和子集
- leetcode 368. Largest Divisible Subset 最大分割子集+LISS最长递增子序列+动态规划DP
- Learning Python 025 字符串分割
- Squid 代理服务器日志的分割
- 简单的图形分割平面的通式HDU2050,5047
- hdoj-【2050 折线分割平面】
- 基于内容的视频分析中关键帧提取和目标分割的融合
- 数组分割