问题 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;
求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