880031 - 求和比较
小蓝在学习C+ +数组时,突发奇想想知道如果将一个连续的正整数数组拆分成两个子数组,然后对拆分出的两个子数组求和并做差,且差值正好等于一个固定的正整数,像这样同一连续的正整数数组拆分方案有多少种。我们一起帮助小蓝设计一下规则: 第一、给出两个正整数N和M 第二、从1到N组成一个连续正整数数组A (A={1,2,3,4……N}) 第三、将数组A拆分成两个子数组A1、A2: 两个子数组中不能出现相同的数 子数组中的数字可以是连续的也可以是不连续的 拆分出的两组子数组的元素个数可以不同,但总数量等于A数组元素个数 第四、对A1、A2两个子数组分别求和 第五、对A1、A2两个子数组的和做差(大的数字减去小的数字) 第六、如果差值正好等于固定值M,则判定此拆分方案成立。 如:N = 5, M = 1,连续正整数数组A={1, 2, 3, 4, 5}。符合条件的拆分方案有3种: A1={1, 2, 4}, A2={3, 5},其中A1的和为7, A2的和为8,和的差值等于1 A1 ={1, 3, 4}, A2={2, 5},其中A1的和为8, A2的和为7,和的差值等于1 A1={3, 4}, A2={1,2,5},其中A1的和为7,A2的和为8,和的差值等于1
输入
分别输入两个正整数N(3 < N < 30)和M(0 < M < 500 0<M<500),两个正整数由一个空格隔开
输出
输出一个正整数,表示1到N (包含1和N)连续的正整数数组中有多少种方案,使得拆分的两个子数组部分和的差值等于M
样例
输入
5 1
输出
3
提示
本题属于计数型动态规划问题,我们可以定义出状态dp[i][j]表示1~i的数字拆分成两个子数组求和的差的绝对值为j的方案数。
方程为 dp[i][j] = dp[i-1][j+i] + dp[i-1][abs(j-i)]
答案需要特判m == 0时的情况,例如n=3, m=0时,只有一组A1={1, 2}, A2={3},但使用dp会将正反计算两次,因此需要对结果除以2;
其他情况下,不会出现正反计算两次的情况,因此直接输出即可。