2018山东冬令营:数学题

问题 A: 数学题

时间限制: 1 Sec  内存限制: 128 MB
提交: 62  解决: 22
[提交][状态][讨论版]

题目描述

给出一个n个未知数的方程,x[1],x[2],x[3]......x[n]
求x[1]+x[2]+x[3]....+x[n]==S的正整数解的个数,并且要保证,
对于任意i (1<=i< n) x[i]与x[i+1]相差不大于P;

输入

第一行三个整数n,S,P。

输出

一行一个整数表示方程解的个数。

样例输入

2 10 2

样例输出

3

提示

三种情况分别是:
5+5=10
4+6=10
6+4=10

对于 30% 数据 2<=n<=10 ,p=0,S<=30;
对于 100% 数据 2<=n<=10,p<=3 , S<=30;
保证数据有梯度。


【思路】

DFS 搜索,就可以,  pre 记录前驱,  注意剪枝


【代码实现】

#include <iostream>
#include <bits/stdc++.h>
 
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
 
 
typedef long long ll;
const int MAXN=1e6+5;
const ll INF=0x3f3f3f3f;
int n,s,p;
 
int a[5000];
int sc;
void dfs(int cot,int sum,int pre)
{
    if(sum>s) return ;
    if(cot==n-1)
    {
        if(sum==s)
        {
            //cout<<sum<<" "<<pre<<endl;
                sc++;
        }
        return ;
    }
    for(int i=min(pre,1);i<=max(pre,s);i++)
    {
        if( abs(i-pre)<=p )
            dfs(cot+1,sum+i,i);
    }
 
}
int main()
{
 
    sc=0;
    cin>>n>>s>>p;
    for(int i=1;i<=30;i++)
        dfs(0,i,i);
    cout<<sc<<endl;
    return 0;
}

123


posted @ 2018-03-05 17:18  Sizaif  阅读(176)  评论(0编辑  收藏  举报