集合划分(subset)

对于从1到N(1<=N<=3)的连续整数集合,划分成两个子集合,使得每个集合的数字之和相等。举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,他们每个的所有数字和是相等的:{3} and {1,2} 这是唯一的一种分法(交换集合位置被认为是同一种划分方案,因此不会增加划分方案总数)。如果N=7,有四种方法能划分集合{1,2,3,4,5,6,7},每一种分法的子集合各数字和是相等的: {1,6,7} and {2,3,4,5};{2,5,7} and {1,3,4,6}; {3,4,7} and {1,2,5,6};{1,2,4,7} and {3,5,6}


var f:array[0..100,0..100] of longint;
    n,s,i,j:longint;
begin
  fillchar(f,sizeof(f),0);
  read(n);
  s:=n*(n+1) div 2;
  if (s mod 2=1) then
   begin
    writeln(0);
    halt;
   end
//总和是奇数无法平分直接输出零
  else
   begin
    f[n,0]:=1;
    f[n,n]:=1;
    s:=s div 2;
//也可以一开始div4
    for i:=n-1 downto 2 do
     for j:=0 to s do
      begin
       f[i,j]:=f[i+1,j];
       if j-i>=0 then f[i,j]:=f[i,j]+f[i+1,j-i];
//f[i,j]表示从i..n中取数得和为j的方案数,j-i意为取完数了
      end;
    writeln(f[2,s]);
   end;
end.
时间: 2024-12-29 09:05:17

集合划分(subset)的相关文章

hlg1541集合划分【01背包】

集合划分 Time Limit: 1000 MS Memory Limit: 65535 K Total Submit: 44(17 users) Total Accepted: 22(16 users) Rating:  Special Judge: No Description 对于从1到N (1 <= N <= 39) 的连续整数集合,能划分成两个子集合,且保证每个集合的数字和是相等的.举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,每个子集合的所有数字和是相等的:{3} 和

Ka的递归编程练习 Part3|集合划分啦

1 #include<stdio.h> 2 int ss(int n,int k) 3 { 4 if(n==k||k==1) return 1; 5 return ss(n-1,k-1)+k*ss(n-1,k); 6 } 7 int main() 8 { 9 int s,n,k; 10 scanf("%d%d",&n,&k); 11 n>=k?s=ss(n,k):s=-1; 12 printf("%d",s); 13 return

枚举集合划分方案

1. 题目 有n个互不相同的整数,将其划分成m个均不为空的集合,枚举所有的划分方案. 2. 分析 (1)该问题明显不同于整数划分问题(http://blog.csdn.net/woniu317/article/details/39250403 ),整数划分问题等价于划分有n个元素集合的方案总数,且集合中的元素相同,因为若不同即使个数相同划分方案也为不同. (2) 易得该问题属于典型的回溯问题. 3. 实现 #include <vector> #include <iostream>

CODEVS 2055 集合划分

[题目描述] 对于从1到N(1<=N<=39)的连续整数集合,划分成两个子集合,使得每个集合的数字之和相等. 举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,他们每个的所有数字和是相等的:{3} and {1,2} 这是唯一的一种分法(交换集合位置被认为是同一种划分方案,因此不会增加划分方案总数). 如果N=7,有四种方法能划分集合{1,2,3,4,5,6,7},每一种分法的子集合各数字和是相等的: {1,6,7} and {2,3,4,5};{2,5,7} and {1,3,4,

LuoguP5748 集合划分计数

题意 一个有\(n\)个元素的集合,将其分为任意个非空子集,求方案数.集合之间是无序的,\(\{\{1,2\},\{3\}\}=\{\{3\},\{1,2\}\}\). 设\(f_n\)表示用\(n\)个元素组成的集合的个数,显然\(f_n=1\).设\(F(x)\)为\(f\)的指数型生成函数,那么\(F(x)=\sum_{i=1}\frac{x^i}{i!}\),\(F^i(x)\)的第\(n\)位就是\(i\)个元素个数之和为\(n\)的集合组合在一起的方案数. 设\(g_i\)为\(n=

BZOJ 2127: happiness(最小割解决集合划分)

Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 2350  Solved: 1138[Submit][Status][Discuss] Description 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,那么他们又将收获一些喜悦值.作为计算机竞赛教练的scp大老板,想知道如何分配可以使得全班的

USACO 2.2 Subset Sums 集合(subset)

http://zhan.renren.com/000915?gid=3602888498063658248&checked=truehttp://zhan.renren.com/000915?gid=3602888498063658247&checked=truehttp://zhan.renren.com/000915?gid=3602888498063658246&checked=truehttp://zhan.renren.com/000915?gid=36028884980

leetcode 698 集合k划分

集合划分 参考:负雪明烛 (leetcode 698) 给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等. 面试的时候面到这一题,大脑一片空白.知道大致的方向,深搜,回溯.但是就是不知道如何下手,练的太少. class Solution: def canPartitionKSubsets(self, nums: List[int], k: int) -> bool: if not nums or len(nums) < k: return

拆分集合为相等的子集合(第1届第1题)

题目要求 问题描述:将1到N的连续整数组成的集合划分为两个子集合,且保证每个集合的数字和相等.例如,对于N=4,对应的集合{1,2,3,4},能被划分为{1,4}.{2,3}两个集合,使得1+4=2+3,且划分方案只有此一种.编程实现给定任一正整数N(1<=N<=39),输出其符合题意的划分方案数. 样例输入1:3 样例输出1:1    (可划分为{1,2}.{3}) 样例输入2:4 样例输出2:1    (可划分为{1,3}.{2,4}) 样例输入3:7 样例输出3:4    (可划分为{1