求和比较c++(蓝桥杯真题)

第十二届蓝桥杯的真题——求和比较;

求和比较

小蓝在学习 C++数组时,突发奇想想知道如果将一个连续的正整数数组拆分成两个子数组,然后对拆分后的两个子数组求和并做差,且差值正好等于一个固定的正整数,像这样同一个连续的正整数数组拆分方案有多少种。

我们一起帮助小蓝设计一下规则:

第一给出两个正整数 N 和 M;

第二从 1 到 N 组成一个连续正整数数组 A(A={1,2,3,4......N});

第三将数组 A 拆分成两个子数组 A1、A2(1.拆分的两个子数组中不能出现相同的数;2.子数组中的数字可以是连续的也可以是不连续的;3.拆分出的两组子数组的元素个数可以不同,但总数量等于 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

样例输入

5 1

样例输出

我们就以样例来写这道题:

#include
using namespace std;
int n,m,sum,dp[1000][1000];
int ans;
int main()
{
    cin>>n>>m;//n=5,m=1 
    sum =n*(n+1)/2;//sum=3
    if(m>sum||(sum-m)%2!=0)//false
    {
        cout<<0;
        return 0;
    }
    sum=(sum-m)/2;//sum=1
    for(int i=0;i<=n;i++)
        dp[i][0]=1;//dp的第零行等于1 
    for(int i=1;i<=n;i++)
        for (int j=1;j<=sum;j++)//sum此时等于1 
            if (j >= i)
                dp[i][j]=dp[i-1][j]+dp[i-1][j-i];
            else
                dp[i][j]=dp[i-1][j];
    cout<     return 0;
}

你可能感兴趣的:(算法,c++,数据结构)